From 6b78108ecf3e4e488ebb01d11ac23b4307bf0645 Mon Sep 17 00:00:00 2001 From: s-christoff Date: Thu, 29 Jul 2021 18:52:56 -0600 Subject: [PATCH] Update primary error functions to take a context, deprecate old functions (#1358) * add new error funcs which take a ctx and deprecate existing funcs * use context where available when writing error events * remove circular internal/errors pkg dep * suppress some chatty errors using errors.WithoutEvent() * convert auth oidc funcs to take context where needed to write events Co-authored-by: Jim --- internal/auth/oidc/account.go | 17 +- internal/auth/oidc/account_claim_map.go | 19 +- internal/auth/oidc/account_claim_map_test.go | 10 +- internal/auth/oidc/account_test.go | 31 +- internal/auth/oidc/aud_claim.go | 12 +- internal/auth/oidc/aud_claim_test.go | 13 +- internal/auth/oidc/auth_method.go | 137 +++++---- internal/auth/oidc/auth_method_test.go | 38 +-- internal/auth/oidc/certificate.go | 15 +- internal/auth/oidc/certificate_test.go | 17 +- internal/auth/oidc/certificate_utils.go | 19 +- internal/auth/oidc/certificate_utils_test.go | 7 +- internal/auth/oidc/claims_scope.go | 14 +- internal/auth/oidc/claims_scope_test.go | 12 +- internal/auth/oidc/ids.go | 20 +- internal/auth/oidc/ids_test.go | 6 +- internal/auth/oidc/managed_group.go | 14 +- .../auth/oidc/managed_group_member_account.go | 12 +- internal/auth/oidc/managed_group_test.go | 10 +- internal/auth/oidc/provider.go | 16 +- internal/auth/oidc/provider_test.go | 8 +- internal/auth/oidc/repository.go | 10 +- internal/auth/oidc/repository_account.go | 76 ++--- internal/auth/oidc/repository_account_test.go | 32 +- internal/auth/oidc/repository_auth_method.go | 70 ++--- .../oidc/repository_auth_method_create.go | 30 +- .../repository_auth_method_create_test.go | 9 +- .../oidc/repository_auth_method_delete.go | 10 +- .../repository_auth_method_delete_test.go | 4 +- ...epository_auth_method_operational_state.go | 34 +-- ...tory_auth_method_operational_state_test.go | 4 +- .../auth/oidc/repository_auth_method_read.go | 20 +- .../oidc/repository_auth_method_read_test.go | 8 +- .../auth/oidc/repository_auth_method_test.go | 2 +- .../oidc/repository_auth_method_update.go | 189 ++++++------ .../repository_auth_method_update_test.go | 103 +++---- .../auth/oidc/repository_managed_group.go | 68 ++--- .../oidc/repository_managed_group_members.go | 48 +-- .../repository_managed_group_members_test.go | 2 +- .../oidc/repository_managed_group_test.go | 16 +- internal/auth/oidc/repository_test.go | 4 +- internal/auth/oidc/request/validate.go | 42 +-- internal/auth/oidc/service.go | 56 ++-- internal/auth/oidc/service_callback.go | 66 ++-- internal/auth/oidc/service_callback_test.go | 12 +- internal/auth/oidc/service_start_auth.go | 32 +- internal/auth/oidc/service_start_auth_test.go | 4 +- internal/auth/oidc/service_test.go | 2 +- internal/auth/oidc/service_token_request.go | 32 +- .../auth/oidc/service_token_request_test.go | 2 +- internal/auth/oidc/signing_alg.go | 11 +- internal/auth/oidc/signing_alg_test.go | 13 +- internal/auth/oidc/testing.go | 28 +- internal/auth/password/account.go | 2 +- internal/auth/password/argon2.go | 28 +- internal/auth/password/authmethod.go | 2 +- internal/auth/password/private_ids.go | 4 +- internal/auth/password/public_ids.go | 4 +- internal/auth/password/repository.go | 6 +- internal/auth/password/repository_account.go | 88 +++--- .../auth/password/repository_authmethod.go | 78 ++--- .../auth/password/repository_configuration.go | 36 +-- internal/auth/password/repository_password.go | 110 +++---- internal/authtoken/authtoken.go | 16 +- internal/authtoken/repository.go | 88 +++--- internal/cmd/base/dev.go | 4 +- internal/cmd/base/servers.go | 18 +- internal/cmd/commands/database/init.go | 2 +- internal/cmd/commands/dev/dev.go | 3 +- internal/cmd/commands/server/server.go | 9 +- .../credential/vault/client_certificate.go | 16 +- internal/credential/vault/credential.go | 6 +- internal/credential/vault/credential_store.go | 2 +- internal/credential/vault/jobs.go | 184 ++++++------ .../credential/vault/private_credential.go | 6 +- internal/credential/vault/private_library.go | 20 +- internal/credential/vault/private_store.go | 20 +- internal/credential/vault/public_ids.go | 6 +- internal/credential/vault/repository.go | 8 +- .../vault/repository_credential_library.go | 62 ++-- .../vault/repository_credential_store.go | 178 +++++------ .../vault/repository_credentials.go | 32 +- internal/credential/vault/vault.go | 32 +- internal/credential/vault/vault_token.go | 12 +- internal/db/common/update.go | 16 +- internal/db/id.go | 4 +- internal/db/read_writer.go | 284 +++++++++--------- internal/db/read_writer_test.go | 11 +- internal/db/schema/manager.go | 44 +-- .../migrations/postgres/2/10_auth_test.go | 4 +- internal/db/schema/postgres/postgres.go | 72 ++--- internal/db/schema/schema.go | 10 +- internal/errors/error.go | 94 +++++- internal/errors/error_test.go | 77 +++-- internal/errors/is_test.go | 27 +- internal/errors/match_test.go | 29 +- internal/errors/option.go | 7 + internal/errors/option_test.go | 16 +- internal/host/static/host.go | 2 +- internal/host/static/host_catalog.go | 2 +- internal/host/static/host_set.go | 2 +- internal/host/static/host_set_member.go | 4 +- internal/host/static/public_ids.go | 6 +- internal/host/static/repository.go | 6 +- internal/host/static/repository_host.go | 72 ++--- .../host/static/repository_host_catalog.go | 64 ++-- internal/host/static/repository_host_set.go | 72 ++--- .../host/static/repository_host_set_member.go | 88 +++--- internal/iam/account.go | 4 +- internal/iam/group.go | 6 +- internal/iam/group_member.go | 8 +- internal/iam/ids.go | 10 +- internal/iam/principal_role.go | 26 +- internal/iam/repository.go | 64 ++-- internal/iam/repository_group.go | 152 +++++----- internal/iam/repository_principal_role.go | 150 ++++----- internal/iam/repository_role.go | 58 ++-- internal/iam/repository_role_grant.go | 98 +++--- internal/iam/repository_scope.go | 114 +++---- internal/iam/repository_user.go | 238 +++++++-------- internal/iam/resource.go | 22 +- internal/iam/role.go | 6 +- internal/iam/role_grant.go | 14 +- internal/iam/scope.go | 34 +-- internal/iam/user.go | 6 +- internal/kms/database_key.go | 8 +- internal/kms/database_key_version.go | 20 +- internal/kms/ids.go | 24 +- internal/kms/kms.go | 68 ++--- internal/kms/oidc_key.go | 8 +- internal/kms/oidc_key_version.go | 20 +- internal/kms/oplog_key.go | 8 +- internal/kms/oplog_key_version.go | 20 +- internal/kms/repository.go | 58 ++-- internal/kms/repository_database_key.go | 40 +-- .../kms/repository_database_key_version.go | 54 ++-- internal/kms/repository_oidc_key.go | 40 +-- internal/kms/repository_oidc_key_version.go | 54 ++-- internal/kms/repository_oplog_key.go | 40 +-- internal/kms/repository_oplog_key_version.go | 54 ++-- internal/kms/repository_root_key.go | 38 +-- internal/kms/repository_root_key_version.go | 50 +-- internal/kms/repository_session_key.go | 40 +-- .../kms/repository_session_key_version.go | 54 ++-- internal/kms/repository_token_key.go | 40 +-- internal/kms/repository_token_key_version.go | 54 ++-- internal/kms/root_key.go | 10 +- internal/kms/root_key_version.go | 18 +- internal/kms/session_key.go | 8 +- internal/kms/session_key_version.go | 18 +- internal/kms/token_key.go | 8 +- internal/kms/token_key_version.go | 20 +- internal/observability/event/context.go | 2 + .../observability/event/serialized_writer.go | 9 +- .../event/serialized_writer_test.go | 21 +- internal/oplog/oplog.go | 70 ++--- internal/oplog/queue.go | 30 +- internal/oplog/ticketer.go | 14 +- internal/oplog/type_catalog.go | 20 +- internal/oplog/writer.go | 34 +-- internal/perms/grants.go | 74 ++--- internal/scheduler/job.go | 6 +- internal/scheduler/job/repository.go | 6 +- internal/scheduler/job/repository_job.go | 42 +-- internal/scheduler/job/repository_run.go | 80 ++--- internal/scheduler/scheduler.go | 28 +- internal/servers/common/handler.go | 22 +- internal/servers/common/handler_test.go | 9 +- internal/servers/controller/auth/auth.go | 20 +- .../controller/common/scopeids/scope_ids.go | 12 +- internal/servers/controller/controller.go | 4 +- .../handlers/accounts/account_service.go | 88 +++--- .../handlers/accounts/account_service_test.go | 31 +- .../authmethods/authmethod_service.go | 100 +++--- .../authmethods/authmethod_service_test.go | 15 +- .../controller/handlers/authmethods/oidc.go | 78 ++--- .../handlers/authmethods/oidc_test.go | 21 +- .../handlers/authmethods/password.go | 2 +- .../handlers/authmethods/password_test.go | 12 +- .../handlers/authtokens/authtoken_service.go | 16 +- .../credentiallibrary_service.go | 48 +-- .../credentialstore_service.go | 46 +-- .../handlers/credentialstores/vault.go | 12 +- .../controller/handlers/errors_test.go | 22 +- .../servers/controller/handlers/filtering.go | 2 +- .../handlers/groups/group_service.go | 46 +-- .../host_catalogs/host_catalog_service.go | 26 +- .../handlers/host_sets/host_set_service.go | 40 +-- .../controller/handlers/hosts/host_service.go | 20 +- .../managed_groups/managed_group_service.go | 46 +-- .../managed_group_service_test.go | 16 +- .../controller/handlers/mask_manager.go | 8 +- .../controller/handlers/roles/role_service.go | 38 +-- .../handlers/scopes/scope_service.go | 14 +- .../handlers/sessions/session_service.go | 10 +- .../handlers/targets/target_service.go | 66 ++-- .../controller/handlers/users/user_service.go | 26 +- .../servers/controller/session_cleanup_job.go | 10 +- .../controller/session_cleanup_job_test.go | 4 + internal/servers/controller/testing.go | 2 +- internal/servers/repository.go | 30 +- internal/session/connection.go | 28 +- internal/session/connection_closed_reason.go | 2 +- internal/session/connection_closed_with.go | 4 +- internal/session/connection_state.go | 16 +- internal/session/ids.go | 8 +- internal/session/repository.go | 12 +- internal/session/repository_connection.go | 42 +-- .../session/repository_connection_test.go | 2 +- internal/session/repository_session.go | 212 ++++++------- internal/session/session.go | 82 ++--- internal/session/session_connect_with.go | 10 +- internal/session/session_test.go | 5 +- internal/session/state.go | 16 +- internal/session/term_reason.go | 2 +- internal/session/testing.go | 13 +- internal/session/util.go | 2 +- internal/target/credential_library.go | 4 +- internal/target/ids.go | 2 +- internal/target/repository.go | 72 ++--- .../target/repository_credential_source.go | 108 +++---- internal/target/repository_host_set.go | 96 +++--- internal/target/repository_tcp_target.go | 52 ++-- internal/target/target.go | 2 +- internal/target/target_host_set.go | 10 +- internal/target/tcp_target.go | 10 +- internal/types/subtypes/registry.go | 6 +- 227 files changed, 3945 insertions(+), 3736 deletions(-) diff --git a/internal/auth/oidc/account.go b/internal/auth/oidc/account.go index c87dfe368..ef67887d2 100644 --- a/internal/auth/oidc/account.go +++ b/internal/auth/oidc/account.go @@ -1,6 +1,7 @@ package oidc import ( + "context" "net/url" "github.com/hashicorp/boundary/internal/auth/oidc/store" @@ -40,7 +41,7 @@ type Account struct { // value being unique // // See: https://openid.net/specs/openid-connect-core-1_0.html -func NewAccount(authMethodId string, subject string, opt ...Option) (*Account, error) { +func NewAccount(ctx context.Context, authMethodId string, subject string, opt ...Option) (*Account, error) { const op = "oidc.NewAccount" opts := getOpts(opt...) a := &Account{ @@ -56,7 +57,7 @@ func NewAccount(authMethodId string, subject string, opt ...Option) (*Account, e if opts.withIssuer != nil { a.Issuer = opts.withIssuer.String() } - if err := a.validate(op); err != nil { + if err := a.validate(ctx, op); err != nil { return nil, err // intentionally not wrapped. } @@ -64,21 +65,21 @@ func NewAccount(authMethodId string, subject string, opt ...Option) (*Account, e } // validate the Account. On success, it will return nil. -func (a *Account) validate(caller errors.Op) error { +func (a *Account) validate(ctx context.Context, caller errors.Op) error { if a.AuthMethodId == "" { - return errors.New(errors.InvalidParameter, caller, "missing auth method id") + return errors.New(ctx, errors.InvalidParameter, caller, "missing auth method id") } if a.Subject == "" { - return errors.New(errors.InvalidParameter, caller, "missing subject") + return errors.New(ctx, errors.InvalidParameter, caller, "missing subject") } if _, err := url.Parse(a.Issuer); a.Issuer != "" && err != nil { - return errors.New(errors.InvalidParameter, caller, "not a valid issuer", errors.WithWrap(err)) + return errors.New(ctx, errors.InvalidParameter, caller, "not a valid issuer", errors.WithWrap(err)) } if a.Email != "" && len(a.Email) > 320 { - return errors.New(errors.InvalidParameter, caller, "email address is too long") + return errors.New(ctx, errors.InvalidParameter, caller, "email address is too long") } if a.FullName != "" && len(a.FullName) > 512 { - return errors.New(errors.InvalidParameter, caller, "full name is too long") + return errors.New(ctx, errors.InvalidParameter, caller, "full name is too long") } return nil } diff --git a/internal/auth/oidc/account_claim_map.go b/internal/auth/oidc/account_claim_map.go index 2c0187682..0b917ca1b 100644 --- a/internal/auth/oidc/account_claim_map.go +++ b/internal/auth/oidc/account_claim_map.go @@ -1,6 +1,7 @@ package oidc import ( + "context" "fmt" "github.com/hashicorp/boundary/internal/auth/oidc/store" @@ -21,7 +22,7 @@ const ( ToNameClaim AccountToClaim = "name" ) -func ConvertToAccountToClaim(s string) (AccountToClaim, error) { +func ConvertToAccountToClaim(ctx context.Context, s string) (AccountToClaim, error) { const op = "oidc.(AccountToClaim).convertToAccountToClaim" switch s { case string(ToSubClaim): @@ -31,7 +32,7 @@ func ConvertToAccountToClaim(s string) (AccountToClaim, error) { case string(ToNameClaim): return ToNameClaim, nil default: - return "", errors.New(errors.InvalidParameter, op, fmt.Sprintf("%s is not a valid ToAccountClaim value", s)) + return "", errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s is not a valid ToAccountClaim value", s)) } } @@ -42,7 +43,7 @@ type AccountClaimMap struct { tableName string } -func NewAccountClaimMap(authMethodId, fromClaim string, toClaim AccountToClaim) (*AccountClaimMap, error) { +func NewAccountClaimMap(ctx context.Context, authMethodId, fromClaim string, toClaim AccountToClaim) (*AccountClaimMap, error) { const op = "oidc.NewAccountClaimMap" cs := &AccountClaimMap{ AccountClaimMap: &store.AccountClaimMap{ @@ -51,22 +52,22 @@ func NewAccountClaimMap(authMethodId, fromClaim string, toClaim AccountToClaim) ToClaim: string(toClaim), }, } - if err := cs.validate(op); err != nil { + if err := cs.validate(ctx, op); err != nil { return nil, err } return cs, nil } // validate the AccountClaimMap. On success, it will return nil. -func (cs *AccountClaimMap) validate(caller errors.Op) error { +func (cs *AccountClaimMap) validate(ctx context.Context, caller errors.Op) error { if cs.OidcMethodId == "" { - return errors.New(errors.InvalidParameter, caller, "missing oidc auth method id") + return errors.New(ctx, errors.InvalidParameter, caller, "missing oidc auth method id") } if cs.FromClaim == "" { - return errors.New(errors.InvalidParameter, caller, "missing from claim") + return errors.New(ctx, errors.InvalidParameter, caller, "missing from claim") } - if _, err := ConvertToAccountToClaim(cs.ToClaim); err != nil { - return errors.Wrap(err, caller) + if _, err := ConvertToAccountToClaim(ctx, cs.ToClaim); err != nil { + return errors.Wrap(ctx, err, caller) } return nil } diff --git a/internal/auth/oidc/account_claim_map_test.go b/internal/auth/oidc/account_claim_map_test.go index 7a306317b..68923539f 100644 --- a/internal/auth/oidc/account_claim_map_test.go +++ b/internal/auth/oidc/account_claim_map_test.go @@ -108,7 +108,7 @@ func TestAccountClaimMap_Create(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - got, err := NewAccountClaimMap(tt.args.authMethodId, tt.args.from, tt.args.to) + got, err := NewAccountClaimMap(context.TODO(), tt.args.authMethodId, tt.args.from, tt.args.to) if tt.wantErr { require.Error(err) assert.True(errors.Match(errors.T(tt.wantIsErr), err)) @@ -150,7 +150,7 @@ func TestAccountClaimMap_Delete(t *testing.T) { WithApiUrl(TestConvertToUrls(t, "https://api.com")[0]), WithAudClaims("alice.com")) // seed an extra callback url to just make sure the delete only gets the right num of rows testResource := func(authMethodId string, fromClaim string, toClaim AccountToClaim) *AccountClaimMap { - c, err := NewAccountClaimMap(authMethodId, fromClaim, toClaim) + c, err := NewAccountClaimMap(context.TODO(), authMethodId, fromClaim, toClaim) require.NoError(t, err) return c } @@ -228,7 +228,7 @@ func TestAccountClaimMap_Clone(t *testing.T) { require.NoError(err) m := TestAuthMethod(t, conn, databaseWrapper, org.PublicId, InactiveState, "alice_rp", "my-dogs-name", WithIssuer(TestConvertToUrls(t, "https://alice.com")[0]), WithApiUrl(TestConvertToUrls(t, "https://api.com")[0])) - orig, err := NewAccountClaimMap(m.PublicId, "oid", ToSubClaim) + orig, err := NewAccountClaimMap(context.TODO(), m.PublicId, "oid", ToSubClaim) require.NoError(err) cp := orig.Clone() assert.True(proto.Equal(cp.AccountClaimMap, orig.AccountClaimMap)) @@ -240,9 +240,9 @@ func TestAccountClaimMap_Clone(t *testing.T) { require.NoError(err) m := TestAuthMethod(t, conn, databaseWrapper, org.PublicId, InactiveState, "alice_rp", "my-dogs-name", WithIssuer(TestConvertToUrls(t, "https://alice.com")[0]), WithApiUrl(TestConvertToUrls(t, "https://api.com")[0])) - orig, err := NewAccountClaimMap(m.PublicId, "oid", ToSubClaim) + orig, err := NewAccountClaimMap(context.TODO(), m.PublicId, "oid", ToSubClaim) require.NoError(err) - orig2, err := NewAccountClaimMap(m.PublicId, "uid", ToSubClaim) + orig2, err := NewAccountClaimMap(context.TODO(), m.PublicId, "uid", ToSubClaim) require.NoError(err) cp := orig.Clone() diff --git a/internal/auth/oidc/account_test.go b/internal/auth/oidc/account_test.go index 848944496..e03db7be8 100644 --- a/internal/auth/oidc/account_test.go +++ b/internal/auth/oidc/account_test.go @@ -17,6 +17,7 @@ import ( func TestAccount_Create(t *testing.T) { t.Parallel() + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrapper) @@ -53,7 +54,7 @@ func TestAccount_Create(t *testing.T) { }, create: true, want: func() *Account { - want, err := NewAccount(testAuthMethod.PublicId, "alice", WithIssuer(TestConvertToUrls(t, "https://alice.com")[0]), WithEmail("alice@alice.com"), WithFullName("Alice Eve Smith"), WithName("alice's restuarant"), WithDescription("A good place to eat")) + want, err := NewAccount(ctx, testAuthMethod.PublicId, "alice", WithIssuer(TestConvertToUrls(t, "https://alice.com")[0]), WithEmail("alice@alice.com"), WithFullName("Alice Eve Smith"), WithName("alice's restuarant"), WithDescription("A good place to eat")) require.NoError(t, err) return want }(), @@ -67,7 +68,7 @@ func TestAccount_Create(t *testing.T) { }, create: true, want: func() *Account { - want, err := NewAccount(testAuthMethod.PublicId, "alice", WithIssuer(TestConvertToUrls(t, "https://alice.com")[0]), WithEmail("alice@alice.com"), WithFullName("Alice Eve Smith"), WithName("alice's restuarant"), WithDescription("A good place to eat")) + want, err := NewAccount(ctx, testAuthMethod.PublicId, "alice", WithIssuer(TestConvertToUrls(t, "https://alice.com")[0]), WithEmail("alice@alice.com"), WithFullName("Alice Eve Smith"), WithName("alice's restuarant"), WithDescription("A good place to eat")) require.NoError(t, err) return want }(), @@ -83,7 +84,7 @@ func TestAccount_Create(t *testing.T) { }, create: true, want: func() *Account { - want, err := NewAccount(testAuthMethod.PublicId, "newsubject", WithIssuer(TestConvertToUrls(t, "https://somethingelse.com")[0])) + want, err := NewAccount(ctx, testAuthMethod.PublicId, "newsubject", WithIssuer(TestConvertToUrls(t, "https://somethingelse.com")[0])) require.NoError(t, err) return want }(), @@ -135,7 +136,7 @@ func TestAccount_Create(t *testing.T) { }, create: true, want: func() *Account { - want, err := NewAccount(testAuthMethod.PublicId, "alice", WithIssuer(&url.URL{})) + want, err := NewAccount(ctx, testAuthMethod.PublicId, "alice", WithIssuer(&url.URL{})) require.NoError(t, err) return want }(), @@ -150,7 +151,7 @@ func TestAccount_Create(t *testing.T) { }, create: true, want: func() *Account { - want, err := NewAccount(testAuthMethod.PublicId, "alice") + want, err := NewAccount(ctx, testAuthMethod.PublicId, "alice") require.NoError(t, err) return want }(), @@ -161,7 +162,7 @@ func TestAccount_Create(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - got, err := NewAccount(tt.args.authMethodId, tt.args.subject, tt.args.opts...) + got, err := NewAccount(ctx, tt.args.authMethodId, tt.args.subject, tt.args.opts...) if tt.wantErr { require.Error(err) assert.True(errors.Match(errors.T(tt.wantIsErr), err)) @@ -171,7 +172,7 @@ func TestAccount_Create(t *testing.T) { assert.Equal(tt.want, got) if tt.create { ctx := context.Background() - id, err := newAccountId(testAuthMethod.GetPublicId(), testAuthMethod.GetIssuer(), tt.args.subject) + id, err := newAccountId(ctx, testAuthMethod.GetPublicId(), testAuthMethod.GetIssuer(), tt.args.subject) require.NoError(err) got.PublicId = id err = rw.Create(ctx, got) @@ -194,9 +195,9 @@ func TestAccount_Create(t *testing.T) { t.Run("account issuer stays when auth method discovery url changes", func(t *testing.T) { am := TestAuthMethod(t, conn, databaseWrapper, org.PublicId, InactiveState, "client", "secret", WithIssuer(TestConvertToUrls(t, "https://discovery.com")[0]), WithApiUrl(TestConvertToUrls(t, "https://api.com")[0])) - a, err := NewAccount(am.GetPublicId(), "subject", WithIssuer(TestConvertToUrls(t, am.GetIssuer())[0])) + a, err := NewAccount(ctx, am.GetPublicId(), "subject", WithIssuer(TestConvertToUrls(t, am.GetIssuer())[0])) require.NoError(t, err) - id, err := newAccountId(am.GetPublicId(), am.GetIssuer(), a.GetSubject()) + id, err := newAccountId(ctx, am.GetPublicId(), am.GetIssuer(), a.GetSubject()) require.NoError(t, err) a.PublicId = id ctx := context.Background() @@ -218,6 +219,7 @@ func TestAccount_Create(t *testing.T) { func TestAccount_Delete(t *testing.T) { t.Parallel() + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrapper) @@ -242,9 +244,9 @@ func TestAccount_Delete(t *testing.T) { testResource := func(authMethodId string, subject string) *Account { u, err := url.Parse(testAuthMethod.GetIssuer()) require.NoError(t, err) - a, err := NewAccount(authMethodId, subject, WithIssuer(u)) + a, err := NewAccount(ctx, authMethodId, subject, WithIssuer(u)) require.NoError(t, err) - id, err := newAccountId(testAuthMethod.GetPublicId(), testAuthMethod.GetIssuer(), subject) + id, err := newAccountId(ctx, testAuthMethod.GetPublicId(), testAuthMethod.GetIssuer(), subject) require.NoError(t, err) a.PublicId = id return a @@ -307,6 +309,7 @@ func TestAccount_Delete(t *testing.T) { func TestAccount_Clone(t *testing.T) { t.Parallel() + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrapper) @@ -318,7 +321,7 @@ func TestAccount_Clone(t *testing.T) { require.NoError(err) m := TestAuthMethod(t, conn, databaseWrapper, org.PublicId, InactiveState, "alice_rp", "my-dogs-name", WithIssuer(TestConvertToUrls(t, "https://alice.com")[0]), WithApiUrl(TestConvertToUrls(t, "https://api.com")[0])) - orig, err := NewAccount(m.PublicId, "alice", WithFullName("Alice Eve Smith"), WithEmail("alice@alice.com")) + orig, err := NewAccount(ctx, m.PublicId, "alice", WithFullName("Alice Eve Smith"), WithEmail("alice@alice.com")) require.NoError(err) cp := orig.Clone() assert.True(proto.Equal(cp.Account, orig.Account)) @@ -330,9 +333,9 @@ func TestAccount_Clone(t *testing.T) { require.NoError(err) m := TestAuthMethod(t, conn, databaseWrapper, org.PublicId, InactiveState, "alice_rp", "my-dogs-name", WithIssuer(TestConvertToUrls(t, "https://alice.com")[0]), WithApiUrl(TestConvertToUrls(t, "https://api.com")[0])) - orig, err := NewAccount(m.PublicId, "alice", WithFullName("Alice Eve Smith"), WithEmail("alice@alice.com")) + orig, err := NewAccount(ctx, m.PublicId, "alice", WithFullName("Alice Eve Smith"), WithEmail("alice@alice.com")) require.NoError(err) - orig2, err := NewAccount(m.PublicId, "bob", WithFullName("Bob Eve Smith"), WithEmail("bob@alice.com")) + orig2, err := NewAccount(ctx, m.PublicId, "bob", WithFullName("Bob Eve Smith"), WithEmail("bob@alice.com")) require.NoError(err) cp := orig.Clone() diff --git a/internal/auth/oidc/aud_claim.go b/internal/auth/oidc/aud_claim.go index e8d388790..74a9fb6ee 100644 --- a/internal/auth/oidc/aud_claim.go +++ b/internal/auth/oidc/aud_claim.go @@ -1,6 +1,8 @@ package oidc import ( + "context" + "github.com/hashicorp/boundary/internal/auth/oidc/store" "github.com/hashicorp/boundary/internal/errors" "google.golang.org/protobuf/proto" @@ -29,7 +31,7 @@ type AudClaim struct { // // For more info on oidc aud claims, see the oidc spec: // https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest -func NewAudClaim(authMethodId string, audClaim string) (*AudClaim, error) { +func NewAudClaim(ctx context.Context, authMethodId string, audClaim string) (*AudClaim, error) { const op = "oidc.NewAudClaim" c := &AudClaim{ @@ -38,19 +40,19 @@ func NewAudClaim(authMethodId string, audClaim string) (*AudClaim, error) { Aud: audClaim, }, } - if err := c.validate(op); err != nil { + if err := c.validate(ctx, op); err != nil { return nil, err // intentionally not wrapped } return c, nil } // validate the AudClaim. On success, it will return nil. -func (a *AudClaim) validate(caller errors.Op) error { +func (a *AudClaim) validate(ctx context.Context, caller errors.Op) error { if a.OidcMethodId == "" { - return errors.New(errors.InvalidParameter, caller, "missing oidc auth method id") + return errors.New(ctx, errors.InvalidParameter, caller, "missing oidc auth method id") } if a.Aud == "" { - return errors.New(errors.InvalidParameter, caller, "missing aud claim") + return errors.New(ctx, errors.InvalidParameter, caller, "missing aud claim") } return nil } diff --git a/internal/auth/oidc/aud_claim_test.go b/internal/auth/oidc/aud_claim_test.go index d80a76201..548e55229 100644 --- a/internal/auth/oidc/aud_claim_test.go +++ b/internal/auth/oidc/aud_claim_test.go @@ -15,6 +15,7 @@ import ( func TestAudClaim_Create(t *testing.T) { t.Parallel() + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrapper) @@ -93,7 +94,7 @@ func TestAudClaim_Create(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - got, err := NewAudClaim(tt.args.authMethodId, tt.args.aud) + got, err := NewAudClaim(ctx, tt.args.authMethodId, tt.args.aud) if tt.wantErr { require.Error(err) assert.True(errors.Match(errors.T(tt.wantIsErr), err)) @@ -121,6 +122,7 @@ func TestAudClaim_Create(t *testing.T) { func TestAudClaim_Delete(t *testing.T) { t.Parallel() + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrapper) @@ -135,7 +137,7 @@ func TestAudClaim_Delete(t *testing.T) { WithApiUrl(TestConvertToUrls(t, "https://api.com")[0]), WithAudClaims("alice.com")) // seed an extra callback url to just make sure the delete only gets the right num of rows testResource := func(authMethodId string, AudClaim string) *AudClaim { - c, err := NewAudClaim(authMethodId, AudClaim) + c, err := NewAudClaim(ctx, authMethodId, AudClaim) require.NoError(t, err) return c } @@ -198,6 +200,7 @@ func TestAudClaim_Delete(t *testing.T) { func TestAudClaim_Clone(t *testing.T) { t.Parallel() + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrapper) @@ -209,7 +212,7 @@ func TestAudClaim_Clone(t *testing.T) { require.NoError(err) m := TestAuthMethod(t, conn, databaseWrapper, org.PublicId, InactiveState, "alice_rp", "my-dogs-name", WithIssuer(TestConvertToUrls(t, "https://alice.com")[0]), WithApiUrl(TestConvertToUrls(t, "https://api.com")[0])) - orig, err := NewAudClaim(m.PublicId, "eve.com") + orig, err := NewAudClaim(ctx, m.PublicId, "eve.com") require.NoError(err) cp := orig.Clone() assert.True(proto.Equal(cp.AudClaim, orig.AudClaim)) @@ -221,9 +224,9 @@ func TestAudClaim_Clone(t *testing.T) { require.NoError(err) m := TestAuthMethod(t, conn, databaseWrapper, org.PublicId, InactiveState, "alice_rp", "my-dogs-name", WithIssuer(TestConvertToUrls(t, "https://alice.com")[0]), WithApiUrl(TestConvertToUrls(t, "https://api.com")[0])) - orig, err := NewAudClaim(m.PublicId, "eve.com") + orig, err := NewAudClaim(ctx, m.PublicId, "eve.com") require.NoError(err) - orig2, err := NewAudClaim(m.PublicId, "alice.com") + orig2, err := NewAudClaim(ctx, m.PublicId, "alice.com") require.NoError(err) cp := orig.Clone() diff --git a/internal/auth/oidc/auth_method.go b/internal/auth/oidc/auth_method.go index d79504ed7..1f2417424 100644 --- a/internal/auth/oidc/auth_method.go +++ b/internal/auth/oidc/auth_method.go @@ -63,9 +63,8 @@ type AuthMethod struct { // // Supports the options of WithMaxAge, WithSigningAlgs, WithAudClaims, // WithApiUrl and WithCertificates and all other options are ignored. -func NewAuthMethod(scopeId string, clientId string, clientSecret ClientSecret, opt ...Option) (*AuthMethod, error) { +func NewAuthMethod(ctx context.Context, scopeId string, clientId string, clientSecret ClientSecret, opt ...Option) (*AuthMethod, error) { const op = "oidc.NewAuthMethod" - opts := getOpts(opt...) var u string switch { @@ -96,9 +95,9 @@ func NewAuthMethod(scopeId string, clientId string, clientSecret ClientSecret, o } if len(opts.withCertificates) > 0 { a.Certificates = make([]string, 0, len(opts.withCertificates)) - pem, err := EncodeCertificates(opts.withCertificates...) + pem, err := EncodeCertificates(ctx, opts.withCertificates...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } a.Certificates = append(a.Certificates, pem...) @@ -116,16 +115,16 @@ func NewAuthMethod(scopeId string, clientId string, clientSecret ClientSecret, o } } if a.OperationalState != string(InactiveState) { - if err := a.isComplete(); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("new auth method being created with incomplete data but non-inactive state")) + if err := a.isComplete(ctx); err != nil { + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("new auth method being created with incomplete data but non-inactive state")) } } - if err := a.validate(op); err != nil { + if err := a.validate(ctx, op); err != nil { return nil, err // intentionally not wrapped. } if a.ClientSecretHmac != "" { - return nil, errors.New(errors.InvalidParameter, op, "client secret hmac should be empty") + return nil, errors.New(ctx, errors.InvalidParameter, op, "client secret hmac should be empty") } return a, nil } @@ -141,25 +140,25 @@ func NewAuthMethod(scopeId string, clientId string, clientSecret ClientSecret, o // Also, you can't enforce that MaxAge can't equal zero, since the zero value == // NULL in the database and that's what you want if it's unset. A db constraint // will enforce that MaxAge is either -1, NULL or greater than zero. -func (a *AuthMethod) validate(caller errors.Op) error { +func (a *AuthMethod) validate(ctx context.Context, caller errors.Op) error { if a.ScopeId == "" { - return errors.New(errors.InvalidParameter, caller, "missing scope id") + return errors.New(ctx, errors.InvalidParameter, caller, "missing scope id") } if !validState(a.OperationalState) { - return errors.New(errors.InvalidParameter, caller, fmt.Sprintf("invalid state: %s", a.OperationalState)) + return errors.New(ctx, errors.InvalidParameter, caller, fmt.Sprintf("invalid state: %s", a.OperationalState)) } if a.Issuer != "" { if _, err := url.Parse(a.Issuer); err != nil { - return errors.New(errors.InvalidParameter, caller, "not a valid issuer", errors.WithWrap(err)) + return errors.New(ctx, errors.InvalidParameter, caller, "not a valid issuer", errors.WithWrap(err)) } } if a.ApiUrl != "" { if _, err := url.Parse(a.ApiUrl); err != nil { - return errors.New(errors.InvalidParameter, caller, "not a valid api url", errors.WithWrap(err)) + return errors.New(ctx, errors.InvalidParameter, caller, "not a valid api url", errors.WithWrap(err)) } } if a.MaxAge < -1 { - return errors.New(errors.InvalidParameter, caller, "max age cannot be less than -1") + return errors.New(ctx, errors.InvalidParameter, caller, "max age cannot be less than -1") } return nil } @@ -207,14 +206,14 @@ func (a *AuthMethod) oplog(op oplog.OpType) oplog.Metadata { func (a *AuthMethod) encrypt(ctx context.Context, cipher wrapping.Wrapper) error { const op = "oidc.(AuthMethod).encrypt" if cipher == nil { - return errors.New(errors.InvalidParameter, op, "missing cipher") + return errors.New(ctx, errors.InvalidParameter, op, "missing cipher") } if err := structwrapping.WrapStruct(ctx, cipher, a.AuthMethod, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Encrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt)) } a.KeyId = cipher.KeyID() if err := a.hmacClientSecret(ctx, cipher); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -223,10 +222,10 @@ func (a *AuthMethod) encrypt(ctx context.Context, cipher wrapping.Wrapper) error func (a *AuthMethod) decrypt(ctx context.Context, cipher wrapping.Wrapper) error { const op = "oidc.(AuthMethod).decrypt" if cipher == nil { - return errors.New(errors.InvalidParameter, op, "missing cipher") + return errors.New(ctx, errors.InvalidParameter, op, "missing cipher") } if err := structwrapping.UnwrapStruct(ctx, cipher, a.AuthMethod, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Decrypt)) } return nil } @@ -235,15 +234,15 @@ func (a *AuthMethod) decrypt(ctx context.Context, cipher wrapping.Wrapper) error func (a *AuthMethod) hmacClientSecret(ctx context.Context, cipher wrapping.Wrapper) error { const op = "oidc.(AuthMethod).hmacClientSecret" if cipher == nil { - return errors.New(errors.InvalidParameter, op, "missing cipher") + return errors.New(ctx, errors.InvalidParameter, op, "missing cipher") } reader, err := kms.NewDerivedReader(cipher, 32, []byte(a.PublicId), nil) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } key, _, err := ed25519.GenerateKey(reader) if err != nil { - return errors.New(errors.Encrypt, op, "unable to generate derived key") + return errors.New(ctx, errors.Encrypt, op, "unable to generate derived key") } mac := hmac.New(sha256.New, key) _, _ = mac.Write([]byte(a.ClientSecret)) @@ -253,26 +252,26 @@ func (a *AuthMethod) hmacClientSecret(ctx context.Context, cipher wrapping.Wrapp // isComplete() checks the auth method to see if it has all the required // components of a complete/valid oidc auth method. -func (am *AuthMethod) isComplete() error { +func (am *AuthMethod) isComplete(ctx context.Context) error { const op = "oidc.(AuthMethod).isComplete" var result *multierror.Error - if err := am.validate(op); err != nil { - result = multierror.Append(result, errors.Wrap(err, op)) + if err := am.validate(ctx, op); err != nil { + result = multierror.Append(result, errors.Wrap(ctx, err, op)) } if am.Issuer == "" { - result = multierror.Append(result, errors.New(errors.InvalidParameter, op, "missing issuer")) + result = multierror.Append(result, errors.New(ctx, errors.InvalidParameter, op, "missing issuer")) } if am.ApiUrl == "" { - result = multierror.Append(result, errors.New(errors.InvalidParameter, op, "missing api url")) + result = multierror.Append(result, errors.New(ctx, errors.InvalidParameter, op, "missing api url")) } if am.ClientId == "" { - result = multierror.Append(result, errors.New(errors.InvalidParameter, op, "missing client id")) + result = multierror.Append(result, errors.New(ctx, errors.InvalidParameter, op, "missing client id")) } if am.ClientSecret == "" { - result = multierror.Append(result, errors.New(errors.InvalidParameter, op, "missing client secret")) + result = multierror.Append(result, errors.New(ctx, errors.InvalidParameter, op, "missing client secret")) } if len(am.SigningAlgs) == 0 { - result = multierror.Append(result, errors.New(errors.InvalidParameter, op, "missing signing algorithms")) + result = multierror.Append(result, errors.New(ctx, errors.InvalidParameter, op, "missing signing algorithms")) } return result.ErrorOrNil() } @@ -287,27 +286,27 @@ type convertedValues struct { // convertValueObjects converts the embedded value objects. It will return an // error if the AuthMethod's public id is not set. -func (am *AuthMethod) convertValueObjects() (*convertedValues, error) { +func (am *AuthMethod) convertValueObjects(ctx context.Context) (*convertedValues, error) { const op = "oidc.(AuthMethod).valueObjects" if am.PublicId == "" { - return nil, errors.New(errors.InvalidPublicId, op, "missing public id") + return nil, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } var err error var addAlgs, addAuds, addCerts, addScopes, addAccountClaimMaps []interface{} - if addAlgs, err = am.convertSigningAlgs(); err != nil { - return nil, errors.Wrap(err, op) + if addAlgs, err = am.convertSigningAlgs(ctx); err != nil { + return nil, errors.Wrap(ctx, err, op) } - if addAuds, err = am.convertAudClaims(); err != nil { - return nil, errors.Wrap(err, op) + if addAuds, err = am.convertAudClaims(ctx); err != nil { + return nil, errors.Wrap(ctx, err, op) } - if addCerts, err = am.convertCertificates(); err != nil { - return nil, errors.Wrap(err, op) + if addCerts, err = am.convertCertificates(ctx); err != nil { + return nil, errors.Wrap(ctx, err, op) } - if addScopes, err = am.convertClaimsScopes(); err != nil { - return nil, errors.Wrap(err, op) + if addScopes, err = am.convertClaimsScopes(ctx); err != nil { + return nil, errors.Wrap(ctx, err, op) } - if addAccountClaimMaps, err = am.convertAccountClaimMaps(); err != nil { - return nil, errors.Wrap(err, op) + if addAccountClaimMaps, err = am.convertAccountClaimMaps(ctx); err != nil { + return nil, errors.Wrap(ctx, err, op) } return &convertedValues{ Algs: addAlgs, @@ -321,16 +320,16 @@ func (am *AuthMethod) convertValueObjects() (*convertedValues, error) { // convertSigningAlgs converts the embedded signing algorithms from []string // to []interface{} where each slice element is a *SigningAlg. It will return an // error if the AuthMethod's public id is not set. -func (am *AuthMethod) convertSigningAlgs() ([]interface{}, error) { +func (am *AuthMethod) convertSigningAlgs(ctx context.Context) ([]interface{}, error) { const op = "oidc.(AuthMethod).convertSigningAlgs" if am.PublicId == "" { - return nil, errors.New(errors.InvalidPublicId, op, "missing public id") + return nil, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } newInterfaces := make([]interface{}, 0, len(am.SigningAlgs)) for _, a := range am.SigningAlgs { - obj, err := NewSigningAlg(am.PublicId, Alg(a)) + obj, err := NewSigningAlg(ctx, am.PublicId, Alg(a)) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } newInterfaces = append(newInterfaces, obj) } @@ -340,16 +339,16 @@ func (am *AuthMethod) convertSigningAlgs() ([]interface{}, error) { // convertAudClaims converts the embedded audience claims from []string // to []interface{} where each slice element is a *AudClaim. It will return an // error if the AuthMethod's public id is not set. -func (am *AuthMethod) convertAudClaims() ([]interface{}, error) { +func (am *AuthMethod) convertAudClaims(ctx context.Context) ([]interface{}, error) { const op = "oidc.(AuthMethod).convertAudClaims" if am.PublicId == "" { - return nil, errors.New(errors.InvalidPublicId, op, "missing public id") + return nil, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } newInterfaces := make([]interface{}, 0, len(am.AudClaims)) for _, a := range am.AudClaims { - obj, err := NewAudClaim(am.PublicId, a) + obj, err := NewAudClaim(ctx, am.PublicId, a) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } newInterfaces = append(newInterfaces, obj) } @@ -359,16 +358,16 @@ func (am *AuthMethod) convertAudClaims() ([]interface{}, error) { // convertCertificates converts the embedded certificates from []string // to []interface{} where each slice element is a *Certificate. It will return an // error if the AuthMethod's public id is not set. -func (am *AuthMethod) convertCertificates() ([]interface{}, error) { +func (am *AuthMethod) convertCertificates(ctx context.Context) ([]interface{}, error) { const op = "oidc.(AuthMethod).convertCertificates" if am.PublicId == "" { - return nil, errors.New(errors.InvalidPublicId, op, "missing public id") + return nil, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } newInterfaces := make([]interface{}, 0, len(am.Certificates)) for _, cert := range am.Certificates { - obj, err := NewCertificate(am.PublicId, cert) + obj, err := NewCertificate(ctx, am.PublicId, cert) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } newInterfaces = append(newInterfaces, obj) } @@ -378,16 +377,16 @@ func (am *AuthMethod) convertCertificates() ([]interface{}, error) { // convertClaimsScopes converts the embedded claims scopes from []string // to []interface{} where each slice element is a *ClaimsScope. It will return an // error if the AuthMethod's public id is not set. -func (am *AuthMethod) convertClaimsScopes() ([]interface{}, error) { +func (am *AuthMethod) convertClaimsScopes(ctx context.Context) ([]interface{}, error) { const op = "oidc.(AuthMethod).convertClaimsScopes" if am.PublicId == "" { - return nil, errors.New(errors.InvalidPublicId, op, "missing public id") + return nil, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } newInterfaces := make([]interface{}, 0, len(am.ClaimsScopes)) for _, cs := range am.ClaimsScopes { - obj, err := NewClaimsScope(am.PublicId, cs) + obj, err := NewClaimsScope(ctx, am.PublicId, cs) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } newInterfaces = append(newInterfaces, obj) } @@ -398,28 +397,28 @@ func (am *AuthMethod) convertClaimsScopes() ([]interface{}, error) { // []string to []interface{} where each slice element is a *AccountClaimMap. It // will return an error if the AuthMethod's public id is not set or it can // convert the account claim maps. -func (am *AuthMethod) convertAccountClaimMaps() ([]interface{}, error) { +func (am *AuthMethod) convertAccountClaimMaps(ctx context.Context) ([]interface{}, error) { const op = "oidc.(AuthMethod).convertAccountClaimMaps" if am.PublicId == "" { - return nil, errors.New(errors.InvalidPublicId, op, "missing public id") + return nil, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } newInterfaces := make([]interface{}, 0, len(am.AccountClaimMaps)) const ( from = 0 to = 1 ) - acms, err := ParseAccountClaimMaps(am.AccountClaimMaps...) + acms, err := ParseAccountClaimMaps(ctx, am.AccountClaimMaps...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } for _, m := range acms { - toClaim, err := ConvertToAccountToClaim(m.To) + toClaim, err := ConvertToAccountToClaim(ctx, m.To) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } - obj, err := NewAccountClaimMap(am.PublicId, m.From, toClaim) + obj, err := NewAccountClaimMap(ctx, am.PublicId, m.From, toClaim) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } newInterfaces = append(newInterfaces, obj) } @@ -433,11 +432,11 @@ type ClaimMap struct { } // ParseAccountClaimMaps will parse the inbound claim maps -func ParseAccountClaimMaps(m ...string) ([]ClaimMap, error) { +func ParseAccountClaimMaps(ctx context.Context, m ...string) ([]ClaimMap, error) { const op = "oidc.parseAccountClaimMaps" var b kvbuilder.Builder if err := b.Add(m...); err != nil { - return nil, errors.New(errors.InvalidParameter, op, "error parsing map", errors.WithWrap(err)) + return nil, errors.New(ctx, errors.InvalidParameter, op, "error parsing map", errors.WithWrap(err)) } fromKeys := make([]string, 0, len(m)) for k := range b.Map() { @@ -450,7 +449,7 @@ func ParseAccountClaimMaps(m ...string) ([]ClaimMap, error) { var ok bool to, ok := b.Map()[from].(string) if !ok { - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("account claim map %s value %q is not a string", from, b.Map()[from])) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("account claim map %s value %q is not a string", from, b.Map()[from])) } claimMap = append(claimMap, ClaimMap{ To: to, diff --git a/internal/auth/oidc/auth_method_test.go b/internal/auth/oidc/auth_method_test.go index 3cdd588c3..0aaf2b2aa 100644 --- a/internal/auth/oidc/auth_method_test.go +++ b/internal/auth/oidc/auth_method_test.go @@ -20,6 +20,7 @@ import ( func TestAuthMethod_Create(t *testing.T) { t.Parallel() + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrapper) @@ -243,7 +244,7 @@ func TestAuthMethod_Create(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - got, err := NewAuthMethod(tt.args.scopeId, tt.args.clientId, tt.args.clientSecret, tt.args.opt...) + got, err := NewAuthMethod(ctx, tt.args.scopeId, tt.args.clientId, tt.args.clientSecret, tt.args.opt...) if tt.wantErr { require.Error(err) assert.True(errors.Match(errors.T(tt.wantIsErr), err)) @@ -258,7 +259,7 @@ func TestAuthMethod_Create(t *testing.T) { assert.Equal(tt.want, got) if tt.create { ctx := context.Background() - id, err := newAuthMethodId() + id, err := newAuthMethodId(ctx) require.NoError(err) got.PublicId = id err = got.encrypt(ctx, databaseWrapper) @@ -284,21 +285,21 @@ func TestAuthMethod_Create(t *testing.T) { func TestAuthMethod_Delete(t *testing.T) { t.Parallel() + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrapper) org, _ := iam.TestScopes(t, iam.TestRepo(t, conn, wrapper)) rw := db.New(conn) - ctx := context.Background() databaseWrapper, err := kmsCache.GetWrapper(context.Background(), org.PublicId, kms.KeyPurposeDatabase) require.NoError(t, err) testResource := func(issuer string, clientId, clientSecret string) *AuthMethod { - got, err := NewAuthMethod(org.PublicId, clientId, ClientSecret(clientSecret), + got, err := NewAuthMethod(ctx, org.PublicId, clientId, ClientSecret(clientSecret), WithIssuer(TestConvertToUrls(t, issuer)[0]), WithApiUrl(TestConvertToUrls(t, "http://api.com")[0])) require.NoError(t, err) - id, err := newAuthMethodId() + id, err := newAuthMethodId(ctx) require.NoError(t, err) got.PublicId = id err = got.encrypt(ctx, databaseWrapper) @@ -542,12 +543,13 @@ func Test_encrypt_decrypt_hmac(t *testing.T) { } func Test_convertValueObjects(t *testing.T) { + ctx := context.TODO() testPublicId := "test-id" testAlgs := []string{string(RS256), string(RS384)} var testSigningAlgs []interface{} for _, a := range []Alg{RS256, RS384} { - obj, err := NewSigningAlg(testPublicId, Alg(a)) + obj, err := NewSigningAlg(ctx, testPublicId, Alg(a)) require.NoError(t, err) testSigningAlgs = append(testSigningAlgs, obj) } @@ -555,33 +557,33 @@ func Test_convertValueObjects(t *testing.T) { testAuds := []string{"alice", "eve"} var testAudiences []interface{} for _, a := range testAuds { - obj, err := NewAudClaim(testPublicId, a) + obj, err := NewAudClaim(ctx, testPublicId, a) require.NoError(t, err) testAudiences = append(testAudiences, obj) } _, pem := testGenerateCA(t, "localhost") testCerts := []string{pem} - c, err := NewCertificate(testPublicId, pem) + c, err := NewCertificate(ctx, testPublicId, pem) require.NoError(t, err) testCertificates := []interface{}{c} testScopes := []string{"profile", "email"} testClaimsScopes := make([]interface{}, 0, len(testScopes)) for _, s := range testScopes { - obj, err := NewClaimsScope(testPublicId, s) + obj, err := NewClaimsScope(ctx, testPublicId, s) require.NoError(t, err) testClaimsScopes = append(testClaimsScopes, obj) } testClaimMaps := []string{"oid=sub", "display_name=name"} testAccountClaimMaps := make([]interface{}, 0, len(testClaimMaps)) - acms, err := ParseAccountClaimMaps(testClaimMaps...) + acms, err := ParseAccountClaimMaps(ctx, testClaimMaps...) require.NoError(t, err) for _, m := range acms { - toClaim, err := ConvertToAccountToClaim(m.To) + toClaim, err := ConvertToAccountToClaim(ctx, m.To) require.NoError(t, err) - obj, err := NewAccountClaimMap(testPublicId, m.From, toClaim) + obj, err := NewAccountClaimMap(ctx, testPublicId, m.From, toClaim) require.NoError(t, err) testAccountClaimMaps = append(testAccountClaimMaps, obj) } @@ -634,7 +636,7 @@ func Test_convertValueObjects(t *testing.T) { }, } - convertedAlgs, err := am.convertSigningAlgs() + convertedAlgs, err := am.convertSigningAlgs(ctx) if tt.wantErrMatch != nil { require.Error(err) assert.Truef(errors.Match(tt.wantErrMatch, err), "wanted err %q and got: %+v", tt.wantErrMatch.Code, err) @@ -642,7 +644,7 @@ func Test_convertValueObjects(t *testing.T) { assert.Equal(tt.wantValues.Algs, convertedAlgs) } - convertedAuds, err := am.convertAudClaims() + convertedAuds, err := am.convertAudClaims(ctx) if tt.wantErrMatch != nil { require.Error(err) assert.Truef(errors.Match(tt.wantErrMatch, err), "wanted err %q and got: %+v", tt.wantErrMatch.Code, err) @@ -650,7 +652,7 @@ func Test_convertValueObjects(t *testing.T) { assert.Equal(tt.wantValues.Auds, convertedAuds) } - convertedCerts, err := am.convertCertificates() + convertedCerts, err := am.convertCertificates(ctx) if tt.wantErrMatch != nil { require.Error(err) assert.Truef(errors.Match(tt.wantErrMatch, err), "wanted err %q and got: %+v", tt.wantErrMatch.Code, err) @@ -658,7 +660,7 @@ func Test_convertValueObjects(t *testing.T) { assert.Equal(tt.wantValues.Certs, convertedCerts) } - convertedScopes, err := am.convertClaimsScopes() + convertedScopes, err := am.convertClaimsScopes(ctx) if tt.wantErrMatch != nil { require.Error(err) assert.Truef(errors.Match(tt.wantErrMatch, err), "wanted err %q and got: %+v", tt.wantErrMatch.Code, err) @@ -666,7 +668,7 @@ func Test_convertValueObjects(t *testing.T) { assert.Equal(tt.wantValues.ClaimsScopes, convertedScopes) } - convertedMaps, err := am.convertAccountClaimMaps() + convertedMaps, err := am.convertAccountClaimMaps(ctx) if tt.wantErrMatch != nil { require.Error(err) assert.Truef(errors.Match(tt.wantErrMatch, err), "wanted err %q and got: %+v", tt.wantErrMatch.Code, err) @@ -688,7 +690,7 @@ func Test_convertValueObjects(t *testing.T) { assert.Equal(want, got) } - values, err := am.convertValueObjects() + values, err := am.convertValueObjects(ctx) if tt.wantErrMatch != nil { require.Error(err) assert.Truef(errors.Match(tt.wantErrMatch, err), "wanted err %q and got: %+v", tt.wantErrMatch.Code, err) diff --git a/internal/auth/oidc/certificate.go b/internal/auth/oidc/certificate.go index cd1bcb3a3..a33aa331a 100644 --- a/internal/auth/oidc/certificate.go +++ b/internal/auth/oidc/certificate.go @@ -1,6 +1,7 @@ package oidc import ( + "context" "crypto/x509" "encoding/pem" "fmt" @@ -26,7 +27,7 @@ type Certificate struct { // NewCertificate creates a new in memory certificate assigned to and OIDC auth // method. -func NewCertificate(authMethodId string, certificatePem string) (*Certificate, error) { +func NewCertificate(ctx context.Context, authMethodId string, certificatePem string) (*Certificate, error) { const op = "oidc.NewCertificate" c := &Certificate{ @@ -35,27 +36,27 @@ func NewCertificate(authMethodId string, certificatePem string) (*Certificate, e Cert: certificatePem, }, } - if err := c.validate(op); err != nil { + if err := c.validate(ctx, op); err != nil { return nil, err // intentionally not wrapped } return c, nil } // validate the Certifcate and on success return nil -func (c *Certificate) validate(caller errors.Op) error { +func (c *Certificate) validate(ctx context.Context, caller errors.Op) error { if c.OidcMethodId == "" { - return errors.New(errors.InvalidParameter, caller, "missing oidc auth method id") + return errors.New(ctx, errors.InvalidParameter, caller, "missing oidc auth method id") } if c.Cert == "" { - return errors.New(errors.InvalidParameter, caller, "empty cert") + return errors.New(ctx, errors.InvalidParameter, caller, "empty cert") } block, _ := pem.Decode([]byte(c.Cert)) if block == nil { - return errors.New(errors.InvalidParameter, caller, "failed to parse certificate PEM") + return errors.New(ctx, errors.InvalidParameter, caller, "failed to parse certificate PEM") } _, err := x509.ParseCertificate(block.Bytes) if err != nil { - return errors.New(errors.InvalidParameter, caller, fmt.Sprintf("failed to parse certificate: %s"+err.Error()), errors.WithWrap(err)) + return errors.New(ctx, errors.InvalidParameter, caller, fmt.Sprintf("failed to parse certificate: %s"+err.Error()), errors.WithWrap(err)) } return nil } diff --git a/internal/auth/oidc/certificate_test.go b/internal/auth/oidc/certificate_test.go index 3bc55b792..72a86cd50 100644 --- a/internal/auth/oidc/certificate_test.go +++ b/internal/auth/oidc/certificate_test.go @@ -15,6 +15,7 @@ import ( func TestCertificate_Create(t *testing.T) { t.Parallel() + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrapper) @@ -50,7 +51,7 @@ func TestCertificate_Create(t *testing.T) { }, create: true, want: func() *Certificate { - want, err := NewCertificate(testAuthMethod.PublicId, pem) + want, err := NewCertificate(ctx, testAuthMethod.PublicId, pem) require.NoError(t, err) return want }(), @@ -63,7 +64,7 @@ func TestCertificate_Create(t *testing.T) { }, create: true, want: func() *Certificate { - want, err := NewCertificate(testAuthMethod.PublicId, pem) + want, err := NewCertificate(ctx, testAuthMethod.PublicId, pem) require.NoError(t, err) return want }(), @@ -92,7 +93,7 @@ func TestCertificate_Create(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - got, err := NewCertificate(tt.args.authMethodId, tt.args.certificate) + got, err := NewCertificate(ctx, tt.args.authMethodId, tt.args.certificate) if tt.wantErr { require.Error(err) assert.True(errors.Match(errors.T(tt.wantIsErr), err)) @@ -120,6 +121,7 @@ func TestCertificate_Create(t *testing.T) { func TestCertificate_Delete(t *testing.T) { t.Parallel() + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrapper) @@ -140,7 +142,7 @@ func TestCertificate_Delete(t *testing.T) { _, pem4 := testGenerateCA(t, "localhost") testResource := func(authMethodId string, cert string) *Certificate { - c, err := NewCertificate(authMethodId, cert) + c, err := NewCertificate(ctx, authMethodId, cert) require.NoError(t, err) return c } @@ -203,6 +205,7 @@ func TestCertificate_Delete(t *testing.T) { func TestCertificate_Clone(t *testing.T) { t.Parallel() + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrapper) @@ -216,7 +219,7 @@ func TestCertificate_Clone(t *testing.T) { require.NoError(err) m := TestAuthMethod(t, conn, databaseWrapper, org.PublicId, InactiveState, "alice_rp", "my-dogs-name", WithIssuer(TestConvertToUrls(t, "https://alice.com")[0]), WithApiUrl(TestConvertToUrls(t, "https://api.com")[0])) - orig, err := NewCertificate(m.PublicId, pem) + orig, err := NewCertificate(ctx, m.PublicId, pem) require.NoError(err) cp := orig.Clone() assert.True(proto.Equal(cp.Certificate, orig.Certificate)) @@ -228,9 +231,9 @@ func TestCertificate_Clone(t *testing.T) { require.NoError(err) m := TestAuthMethod(t, conn, databaseWrapper, org.PublicId, InactiveState, "alice_rp", "my-dogs-name", WithIssuer(TestConvertToUrls(t, "https://alice.com")[0]), WithApiUrl(TestConvertToUrls(t, "https://api.com")[0])) - orig, err := NewCertificate(m.PublicId, pem) + orig, err := NewCertificate(ctx, m.PublicId, pem) require.NoError(err) - orig2, err := NewCertificate(m.PublicId, pem2) + orig2, err := NewCertificate(ctx, m.PublicId, pem2) require.NoError(err) cp := orig.Clone() diff --git a/internal/auth/oidc/certificate_utils.go b/internal/auth/oidc/certificate_utils.go index 50087e96f..27d1dadeb 100644 --- a/internal/auth/oidc/certificate_utils.go +++ b/internal/auth/oidc/certificate_utils.go @@ -2,6 +2,7 @@ package oidc import ( "bytes" + "context" "crypto/x509" "encoding/pem" @@ -9,15 +10,15 @@ import ( ) // EncodeCertificates will encode a number of x509 certificates to PEMs. -func EncodeCertificates(certs ...*x509.Certificate) ([]string, error) { +func EncodeCertificates(ctx context.Context, certs ...*x509.Certificate) ([]string, error) { const op = "oidc.EncodeCertificates" if len(certs) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "no certs provided") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no certs provided") } var pems []string for _, cert := range certs { if cert == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil cert") + return nil, errors.New(ctx, errors.InvalidParameter, op, "nil cert") } var buffer bytes.Buffer err := pem.Encode(&buffer, &pem.Block{ @@ -25,7 +26,7 @@ func EncodeCertificates(certs ...*x509.Certificate) ([]string, error) { Bytes: cert.Raw, }) if err != nil { - return nil, errors.New(errors.InvalidParameter, op, "failed to encode cert: "+err.Error(), errors.WithWrap(err)) + return nil, errors.New(ctx, errors.InvalidParameter, op, "failed to encode cert: "+err.Error(), errors.WithWrap(err)) } pems = append(pems, buffer.String()) } @@ -33,23 +34,23 @@ func EncodeCertificates(certs ...*x509.Certificate) ([]string, error) { } // ParseCertificates will parse a number of certificates PEMs to x509s. -func ParseCertificates(pems ...string) ([]*x509.Certificate, error) { +func ParseCertificates(ctx context.Context, pems ...string) ([]*x509.Certificate, error) { const op = "oidc.ParseCertificates" if len(pems) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "no PEMs provided") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no PEMs provided") } var certs []*x509.Certificate for _, p := range pems { if p == "" { - return nil, errors.New(errors.InvalidParameter, op, "empty certificate PEM") + return nil, errors.New(ctx, errors.InvalidParameter, op, "empty certificate PEM") } block, _ := pem.Decode([]byte(p)) if block == nil { - return nil, errors.New(errors.InvalidParameter, op, "failed to parse certificate PEM") + return nil, errors.New(ctx, errors.InvalidParameter, op, "failed to parse certificate PEM") } cert, err := x509.ParseCertificate(block.Bytes) if err != nil { - return nil, errors.New(errors.InvalidParameter, op, "failed to parse certificate: "+err.Error(), errors.WithWrap(err)) + return nil, errors.New(ctx, errors.InvalidParameter, op, "failed to parse certificate: "+err.Error(), errors.WithWrap(err)) } certs = append(certs, cert) } diff --git a/internal/auth/oidc/certificate_utils_test.go b/internal/auth/oidc/certificate_utils_test.go index 5889899ff..d76fbd112 100644 --- a/internal/auth/oidc/certificate_utils_test.go +++ b/internal/auth/oidc/certificate_utils_test.go @@ -1,6 +1,7 @@ package oidc import ( + "context" "crypto/x509" "testing" @@ -10,6 +11,7 @@ import ( ) func TestEncodeCertificates(t *testing.T) { + ctx := context.TODO() tests := []struct { name string setup func() ([]*x509.Certificate, []string) @@ -53,7 +55,7 @@ func TestEncodeCertificates(t *testing.T) { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) certs, pems := tt.setup() - got, err := EncodeCertificates(certs...) + got, err := EncodeCertificates(ctx, certs...) if tt.wantErr { require.Error(err) assert.True(errors.Match(errors.T(tt.wantIsErr), err)) @@ -66,6 +68,7 @@ func TestEncodeCertificates(t *testing.T) { } func TestParseCertificates(t *testing.T) { + ctx := context.TODO() tests := []struct { name string setup func() ([]*x509.Certificate, []string) @@ -109,7 +112,7 @@ func TestParseCertificates(t *testing.T) { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) certs, pems := tt.setup() - got, err := ParseCertificates(pems...) + got, err := ParseCertificates(ctx, pems...) if tt.wantErr { require.Error(err) assert.True(errors.Match(errors.T(tt.wantIsErr), err)) diff --git a/internal/auth/oidc/claims_scope.go b/internal/auth/oidc/claims_scope.go index 5603e221d..cd125cb19 100644 --- a/internal/auth/oidc/claims_scope.go +++ b/internal/auth/oidc/claims_scope.go @@ -1,6 +1,8 @@ package oidc import ( + "context" + "github.com/hashicorp/boundary/internal/auth/oidc/store" "github.com/hashicorp/boundary/internal/errors" "google.golang.org/protobuf/proto" @@ -22,7 +24,7 @@ type ClaimsScope struct { tableName string } -func NewClaimsScope(authMethodId, claimsScope string) (*ClaimsScope, error) { +func NewClaimsScope(ctx context.Context, authMethodId, claimsScope string) (*ClaimsScope, error) { const op = "oidc.NewClaimsScope" cs := &ClaimsScope{ ClaimsScope: &store.ClaimsScope{ @@ -30,22 +32,22 @@ func NewClaimsScope(authMethodId, claimsScope string) (*ClaimsScope, error) { Scope: claimsScope, }, } - if err := cs.validate(op); err != nil { + if err := cs.validate(ctx, op); err != nil { return nil, err } return cs, nil } // validate the ClaimsScope. On success, it will return nil. -func (cs *ClaimsScope) validate(caller errors.Op) error { +func (cs *ClaimsScope) validate(ctx context.Context, caller errors.Op) error { if cs.OidcMethodId == "" { - return errors.New(errors.InvalidParameter, caller, "missing oidc auth method id") + return errors.New(ctx, errors.InvalidParameter, caller, "missing oidc auth method id") } if cs.Scope == "" { - return errors.New(errors.InvalidParameter, caller, "missing claims scope") + return errors.New(ctx, errors.InvalidParameter, caller, "missing claims scope") } if cs.Scope == DefaultClaimsScope { - return errors.New(errors.InvalidParameter, caller, "openid is the default scope and cannot be added as optional") + return errors.New(ctx, errors.InvalidParameter, caller, "openid is the default scope and cannot be added as optional") } return nil } diff --git a/internal/auth/oidc/claims_scope_test.go b/internal/auth/oidc/claims_scope_test.go index d00232448..efdc6a676 100644 --- a/internal/auth/oidc/claims_scope_test.go +++ b/internal/auth/oidc/claims_scope_test.go @@ -97,7 +97,7 @@ func TestClaimsScope_Create(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - got, err := NewClaimsScope(tt.args.authMethodId, tt.args.claimsScope) + got, err := NewClaimsScope(ctx, tt.args.authMethodId, tt.args.claimsScope) if tt.wantErrMatch != nil { require.Error(err) assert.Nil(got) @@ -123,6 +123,7 @@ func TestClaimsScope_Create(t *testing.T) { func TestClaimsScope_Delete(t *testing.T) { t.Parallel() + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrapper) @@ -137,7 +138,7 @@ func TestClaimsScope_Delete(t *testing.T) { WithApiUrl(TestConvertToUrls(t, "https://api.com")[0]), WithAudClaims("alice.com")) // seed an extra callback url to just make sure the delete only gets the right num of rows testResource := func(authMethodId string, claimsScope string) *ClaimsScope { - c, err := NewClaimsScope(authMethodId, claimsScope) + c, err := NewClaimsScope(ctx, authMethodId, claimsScope) require.NoError(t, err) return c } @@ -200,6 +201,7 @@ func TestClaimsScope_Delete(t *testing.T) { func TestClaimsScope_Clone(t *testing.T) { t.Parallel() + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrapper) @@ -211,7 +213,7 @@ func TestClaimsScope_Clone(t *testing.T) { require.NoError(err) m := TestAuthMethod(t, conn, databaseWrapper, org.PublicId, InactiveState, "alice_rp", "my-dogs-name", WithIssuer(TestConvertToUrls(t, "https://alice.com")[0]), WithApiUrl(TestConvertToUrls(t, "https://api.com")[0])) - orig, err := NewClaimsScope(m.PublicId, "profile") + orig, err := NewClaimsScope(ctx, m.PublicId, "profile") require.NoError(err) cp := orig.Clone() assert.True(proto.Equal(cp.ClaimsScope, orig.ClaimsScope)) @@ -223,9 +225,9 @@ func TestClaimsScope_Clone(t *testing.T) { require.NoError(err) m := TestAuthMethod(t, conn, databaseWrapper, org.PublicId, InactiveState, "alice_rp", "my-dogs-name", WithIssuer(TestConvertToUrls(t, "https://alice.com")[0]), WithApiUrl(TestConvertToUrls(t, "https://api.com")[0])) - orig, err := NewClaimsScope(m.PublicId, "email") + orig, err := NewClaimsScope(ctx, m.PublicId, "email") require.NoError(err) - orig2, err := NewClaimsScope(m.PublicId, "profile") + orig2, err := NewClaimsScope(ctx, m.PublicId, "profile") require.NoError(err) cp := orig.Clone() diff --git a/internal/auth/oidc/ids.go b/internal/auth/oidc/ids.go index 9e791fb13..8edf0e9c0 100644 --- a/internal/auth/oidc/ids.go +++ b/internal/auth/oidc/ids.go @@ -1,6 +1,8 @@ package oidc import ( + "context" + "github.com/hashicorp/boundary/internal/auth" "github.com/hashicorp/boundary/internal/db" "github.com/hashicorp/boundary/internal/errors" @@ -23,38 +25,38 @@ const ( Subtype = subtypes.Subtype("oidc") ) -func newAuthMethodId() (string, error) { +func newAuthMethodId(ctx context.Context) (string, error) { const op = "oidc.newAuthMethodId" id, err := db.NewPublicId(AuthMethodPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.Wrap(ctx, err, op) } return id, nil } -func newAccountId(authMethodId, issuer, sub string) (string, error) { +func newAccountId(ctx context.Context, authMethodId, issuer, sub string) (string, error) { const op = "oidc.newAccountId" if authMethodId == "" { - return "", errors.New(errors.InvalidParameter, op, "missing auth method id") + return "", errors.New(ctx, errors.InvalidParameter, op, "missing auth method id") } if issuer == "" { - return "", errors.New(errors.InvalidParameter, op, "missing issuer") + return "", errors.New(ctx, errors.InvalidParameter, op, "missing issuer") } if sub == "" { - return "", errors.New(errors.InvalidParameter, op, "missing subject") + return "", errors.New(ctx, errors.InvalidParameter, op, "missing subject") } id, err := db.NewPublicId(AccountPrefix, db.WithPrngValues([]string{authMethodId, issuer, sub})) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.Wrap(ctx, err, op) } return id, nil } -func newManagedGroupId() (string, error) { +func newManagedGroupId(ctx context.Context) (string, error) { const op = "oidc.newManagedGroupId" id, err := db.NewPublicId(intglobals.OidcManagedGroupPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.Wrap(ctx, err, op) } return id, nil } diff --git a/internal/auth/oidc/ids_test.go b/internal/auth/oidc/ids_test.go index 3e254c90e..fb82ee82d 100644 --- a/internal/auth/oidc/ids_test.go +++ b/internal/auth/oidc/ids_test.go @@ -1,6 +1,7 @@ package oidc import ( + "context" "strings" "testing" @@ -10,13 +11,14 @@ import ( func Test_Ids(t *testing.T) { t.Parallel() + ctx := context.TODO() t.Run(AuthMethodPrefix, func(t *testing.T) { - id, err := newAuthMethodId() + id, err := newAuthMethodId(ctx) require.NoError(t, err) assert.True(t, strings.HasPrefix(id, AuthMethodPrefix+"_")) }) t.Run(AccountPrefix, func(t *testing.T) { - id, err := newAccountId("public-id", "test-issuer", "test-subject") + id, err := newAccountId(ctx, "public-id", "test-issuer", "test-subject") require.NoError(t, err) assert.True(t, strings.HasPrefix(id, AccountPrefix+"_")) }) diff --git a/internal/auth/oidc/managed_group.go b/internal/auth/oidc/managed_group.go index ff74c5733..6ac9bf0d6 100644 --- a/internal/auth/oidc/managed_group.go +++ b/internal/auth/oidc/managed_group.go @@ -1,6 +1,8 @@ package oidc import ( + "context" + "github.com/hashicorp/boundary/internal/auth/oidc/store" "github.com/hashicorp/boundary/internal/errors" "github.com/hashicorp/boundary/internal/oplog" @@ -20,7 +22,7 @@ type ManagedGroup struct { // NewManagedGroup creates a new in memory ManagedGroup assigned to OIDC // AuthMethod. Supported options are withName and withDescription. -func NewManagedGroup(authMethodId string, filter string, opt ...Option) (*ManagedGroup, error) { +func NewManagedGroup(ctx context.Context, authMethodId string, filter string, opt ...Option) (*ManagedGroup, error) { const op = "oidc.NewManagedGroup" opts := getOpts(opt...) mg := &ManagedGroup{ @@ -31,7 +33,7 @@ func NewManagedGroup(authMethodId string, filter string, opt ...Option) (*Manage Filter: filter, }, } - if err := mg.validate(op); err != nil { + if err := mg.validate(ctx, op); err != nil { return nil, err // intentionally not wrapped. } @@ -39,15 +41,15 @@ func NewManagedGroup(authMethodId string, filter string, opt ...Option) (*Manage } // validate the Managed Group. On success, it will return nil. -func (mg *ManagedGroup) validate(caller errors.Op) error { +func (mg *ManagedGroup) validate(ctx context.Context, caller errors.Op) error { if mg.AuthMethodId == "" { - return errors.New(errors.InvalidParameter, caller, "missing auth method id") + return errors.New(ctx, errors.InvalidParameter, caller, "missing auth method id") } if mg.Filter == "" { - return errors.New(errors.InvalidParameter, caller, "missing filter") + return errors.New(ctx, errors.InvalidParameter, caller, "missing filter") } if _, err := bexpr.CreateEvaluator(mg.Filter); err != nil { - return errors.New(errors.InvalidParameter, caller, "error evaluating filter expression", errors.WithWrap(err)) + return errors.New(ctx, errors.InvalidParameter, caller, "error evaluating filter expression", errors.WithWrap(err)) } return nil diff --git a/internal/auth/oidc/managed_group_member_account.go b/internal/auth/oidc/managed_group_member_account.go index 0f4719d3a..4aa47eaa5 100644 --- a/internal/auth/oidc/managed_group_member_account.go +++ b/internal/auth/oidc/managed_group_member_account.go @@ -1,6 +1,8 @@ package oidc import ( + "context" + "github.com/hashicorp/boundary/internal/auth/oidc/store" "github.com/hashicorp/boundary/internal/errors" "google.golang.org/protobuf/proto" @@ -19,7 +21,7 @@ type ManagedGroupMemberAccount struct { // NewManagedGroupMemberAccount creates a new in memory // ManagedGroupMemberAccount assigned to a managed group within an OIDC // AuthMethod. Supported options are withName and withDescription. -func NewManagedGroupMemberAccount(managedGroupId string, memberId string, opt ...Option) (*ManagedGroupMemberAccount, error) { +func NewManagedGroupMemberAccount(ctx context.Context, managedGroupId string, memberId string, opt ...Option) (*ManagedGroupMemberAccount, error) { const op = "oidc.NewManagedGroupMemberAccount" mg := &ManagedGroupMemberAccount{ ManagedGroupMemberAccount: &store.ManagedGroupMemberAccount{ @@ -27,7 +29,7 @@ func NewManagedGroupMemberAccount(managedGroupId string, memberId string, opt .. MemberId: memberId, }, } - if err := mg.validate(op); err != nil { + if err := mg.validate(ctx, op); err != nil { return nil, err // intentionally not wrapped. } @@ -35,12 +37,12 @@ func NewManagedGroupMemberAccount(managedGroupId string, memberId string, opt .. } // validate the ManagedGroupMemberAccount. On success, it will return nil. -func (mg *ManagedGroupMemberAccount) validate(caller errors.Op) error { +func (mg *ManagedGroupMemberAccount) validate(ctx context.Context, caller errors.Op) error { if mg.ManagedGroupId == "" { - return errors.New(errors.InvalidParameter, caller, "missing managed group id") + return errors.New(ctx, errors.InvalidParameter, caller, "missing managed group id") } if mg.MemberId == "" { - return errors.New(errors.InvalidParameter, caller, "missing member id") + return errors.New(ctx, errors.InvalidParameter, caller, "missing member id") } return nil diff --git a/internal/auth/oidc/managed_group_test.go b/internal/auth/oidc/managed_group_test.go index 178524668..00eb686d9 100644 --- a/internal/auth/oidc/managed_group_test.go +++ b/internal/auth/oidc/managed_group_test.go @@ -1,6 +1,7 @@ package oidc import ( + "context" "testing" "github.com/hashicorp/boundary/internal/errors" @@ -9,24 +10,25 @@ import ( func Test_ManagedGroups_RepoValidate(t *testing.T) { t.Parallel() + ctx := context.TODO() assert := assert.New(t) const op = "test" mg := AllocManagedGroup() t.Run("empty auth method", func(t *testing.T) { - assert.Contains(mg.validate(op).Error(), errors.New(errors.InvalidParameter, op, "missing auth method id").Error()) + assert.Contains(mg.validate(ctx, op).Error(), errors.New(ctx, errors.InvalidParameter, op, "missing auth method id").Error(), errors.WithoutEvent()) }) t.Run("empty filter", func(t *testing.T) { mg.AuthMethodId = "amoidc_1234567890" - assert.Contains(mg.validate(op).Error(), errors.New(errors.InvalidParameter, op, "missing filter").Error()) + assert.Contains(mg.validate(ctx, op).Error(), errors.New(ctx, errors.InvalidParameter, op, "missing filter").Error(), errors.WithoutEvent()) }) t.Run("bad filter", func(t *testing.T) { mg.AuthMethodId = "amoidc_1234567890" mg.Filter = "foobar" - assert.Contains(mg.validate(op).Error(), errors.New(errors.InvalidParameter, op, "error evaluating filter expression").Error()) + assert.Contains(mg.validate(ctx, op).Error(), errors.New(ctx, errors.InvalidParameter, op, "error evaluating filter expression").Error(), errors.WithoutEvent()) }) t.Run("valid", func(t *testing.T) { mg.AuthMethodId = "amoidc_1234567890" mg.Filter = TestFakeManagedGroupFilter - assert.NoError(mg.validate(op)) + assert.NoError(mg.validate(ctx, op)) }) } diff --git a/internal/auth/oidc/provider.go b/internal/auth/oidc/provider.go index 344e52c67..1854821f3 100644 --- a/internal/auth/oidc/provider.go +++ b/internal/auth/oidc/provider.go @@ -58,7 +58,7 @@ func (c *providers) get(ctx context.Context, currentFromDb *AuthMethod) (*oidc.P const op = "oidc.(providers).getProvider" storedProvider, err := convertToProvider(ctx, currentFromDb) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } c.mu.RLock() p, ok := c.cache[currentFromDb.PublicId] @@ -66,11 +66,11 @@ func (c *providers) get(ctx context.Context, currentFromDb *AuthMethod) (*oidc.P if ok { cachedHash, err := p.ConfigHash() if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to hash provider from cache")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to hash provider from cache")) } storedHash, err := storedProvider.ConfigHash() if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to hash provider from database")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to hash provider from database")) } switch cachedHash == storedHash { case true: @@ -100,10 +100,10 @@ func (c *providers) delete(ctx context.Context, authMethodId string) { func convertToProvider(ctx context.Context, am *AuthMethod) (*oidc.Provider, error) { const op = "oidc.convertToProvider" if am == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing auth method") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing auth method") } - if err := am.isComplete(); err != nil { - return nil, errors.Wrap(err, op) + if err := am.isComplete(ctx); err != nil { + return nil, errors.Wrap(ctx, err, op) } algs := make([]oidc.Alg, 0, len(am.SigningAlgs)) for _, a := range am.SigningAlgs { @@ -119,11 +119,11 @@ func convertToProvider(ctx context.Context, am *AuthMethod) (*oidc.Provider, err oidc.WithProviderCA(strings.Join(am.Certificates, "\n")), ) if err != nil { - return nil, errors.New(errors.InvalidParameter, op, "AuthMethod cannot be converted to a valid OIDC Provider Configuration", errors.WithWrap(err)) + return nil, errors.New(ctx, errors.InvalidParameter, op, "AuthMethod cannot be converted to a valid OIDC Provider Configuration", errors.WithWrap(err)) } p, err := oidc.NewProvider(c) if err != nil { - return nil, errors.New(errors.InvalidParameter, op, "AuthMethod cannot be converted to a valid OIDC Provider", errors.WithWrap(err)) + return nil, errors.New(ctx, errors.InvalidParameter, op, "AuthMethod cannot be converted to a valid OIDC Provider", errors.WithWrap(err)) } return p, nil } diff --git a/internal/auth/oidc/provider_test.go b/internal/auth/oidc/provider_test.go index 7a0ddee20..8696c1e74 100644 --- a/internal/auth/oidc/provider_test.go +++ b/internal/auth/oidc/provider_test.go @@ -21,13 +21,13 @@ func Test_ProviderCaching(t *testing.T) { _, _, signingAlg, _ := tp.SigningKeys() allowedRedirect := "https://alice.com/callback" - authMethodId, err := newAuthMethodId() + authMethodId, err := newAuthMethodId(ctx) require.NoError(t, err) id := authMethodId secret := authMethodId p1 := testProvider(t, id, secret, fmt.Sprintf(CallbackEndpoint, allowedRedirect), tp) // provider needs the complete callback URL - testAm, err := NewAuthMethod("fake-org", id, ClientSecret(secret), + testAm, err := NewAuthMethod(ctx, "fake-org", id, ClientSecret(secret), WithIssuer(issuer), WithApiUrl(TestConvertToUrls(t, allowedRedirect)[0])) require.NoError(t, err) @@ -90,12 +90,12 @@ func Test_convertToProvider(t *testing.T) { _, _, signingAlg, _ := tp.SigningKeys() allowedRedirect := "https://alice.com/callback" - authMethodId, err := newAuthMethodId() + authMethodId, err := newAuthMethodId(ctx) require.NoError(t, err) id := authMethodId secret := authMethodId p := testProvider(t, id, secret, fmt.Sprintf(CallbackEndpoint, allowedRedirect), tp) // provider callback needs the complete URL - testAm, err := NewAuthMethod("fake-org", id, ClientSecret(secret), + testAm, err := NewAuthMethod(ctx, "fake-org", id, ClientSecret(secret), WithIssuer(issuer), WithApiUrl(TestConvertToUrls(t, allowedRedirect)[0])) require.NoError(t, err) diff --git a/internal/auth/oidc/repository.go b/internal/auth/oidc/repository.go index 9dbd9d263..b9304ff6f 100644 --- a/internal/auth/oidc/repository.go +++ b/internal/auth/oidc/repository.go @@ -1,6 +1,8 @@ package oidc import ( + "context" + "github.com/hashicorp/boundary/internal/db" "github.com/hashicorp/boundary/internal/errors" "github.com/hashicorp/boundary/internal/kms" @@ -18,16 +20,16 @@ type Repository struct { // NewRepository creates a new oidc Repository. Supports the options: WithLimit // which sets a default limit on results returned by repo operations. -func NewRepository(r db.Reader, w db.Writer, kms *kms.Kms, opt ...Option) (*Repository, error) { +func NewRepository(ctx context.Context, r db.Reader, w db.Writer, kms *kms.Kms, opt ...Option) (*Repository, error) { const op = "oidc.NewRepository" if r == nil { - return nil, errors.New(errors.InvalidParameter, op, "reader is nil") + return nil, errors.New(ctx, errors.InvalidParameter, op, "reader is nil") } if w == nil { - return nil, errors.New(errors.InvalidParameter, op, "writer is nil") + return nil, errors.New(ctx, errors.InvalidParameter, op, "writer is nil") } if kms == nil { - return nil, errors.New(errors.InvalidParameter, op, "kms is nil") + return nil, errors.New(ctx, errors.InvalidParameter, op, "kms is nil") } opts := getOpts(opt...) if opts.withLimit == 0 { diff --git a/internal/auth/oidc/repository_account.go b/internal/auth/oidc/repository_account.go index ec9fc011b..1f6ed7ffa 100644 --- a/internal/auth/oidc/repository_account.go +++ b/internal/auth/oidc/repository_account.go @@ -29,22 +29,22 @@ import ( func (r *Repository) CreateAccount(ctx context.Context, scopeId string, a *Account, opt ...Option) (*Account, error) { const op = "oidc.(Repository).CreateAccount" if a == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing Account") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing Account") } if a.Account == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing embedded Account") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing embedded Account") } if a.AuthMethodId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing auth method id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing auth method id") } if a.Subject == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing subject") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing subject") } if a.PublicId != "" { - return nil, errors.New(errors.InvalidParameter, op, "public id must be empty") + return nil, errors.New(ctx, errors.InvalidParameter, op, "public id must be empty") } if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } a = a.Clone() @@ -59,34 +59,34 @@ func (r *Repository) CreateAccount(ctx context.Context, scopeId string, a *Accou if a.Issuer == "" { am, err := r.LookupAuthMethod(ctx, a.AuthMethodId) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get auth method")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get auth method")) } if am.GetIssuer() == "" { - return nil, errors.New(errors.InvalidParameter, op, "no issuer on auth method") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no issuer on auth method") } a.Issuer = am.GetIssuer() } if a.Issuer == "" { - return nil, errors.New(errors.InvalidParameter, op, "no issuer provided or defined in auth method") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no issuer provided or defined in auth method") } opts := getOpts(opt...) if opts.withPublicId != "" { if !strings.HasPrefix(opts.withPublicId, AccountPrefix+"_") { - return nil, errors.New(errors.InvalidParameter, op, "chosen account id does not have a valid prefix") + return nil, errors.New(ctx, errors.InvalidParameter, op, "chosen account id does not have a valid prefix") } a.PublicId = opts.withPublicId } else { - id, err := newAccountId(a.AuthMethodId, a.Issuer, a.Subject) + id, err := newAccountId(ctx, a.AuthMethodId, a.Issuer, a.Subject) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } a.PublicId = id } oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper"), errors.WithCode(errors.Encrypt)) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper"), errors.WithCode(errors.Encrypt)) } var newAccount *Account @@ -94,7 +94,7 @@ func (r *Repository) CreateAccount(ctx context.Context, scopeId string, a *Accou func(_ db.Reader, w db.Writer) error { newAccount = a.Clone() if err := w.Create(ctx, newAccount, db.WithOplog(oplogWrapper, a.oplog(oplog.OpType_OP_TYPE_CREATE, scopeId))); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, @@ -102,11 +102,11 @@ func (r *Repository) CreateAccount(ctx context.Context, scopeId string, a *Accou if err != nil { if errors.IsUniqueError(err) { - return nil, errors.New(errors.NotUnique, op, fmt.Sprintf( + return nil, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf( "in auth method %s: name %q already exists or subject %q already exists for issuer %q in scope %s", a.AuthMethodId, a.Name, a.Subject, a.Issuer, scopeId)) } - return nil, errors.Wrap(err, op, errors.WithMsg(a.AuthMethodId)) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(a.AuthMethodId)) } return newAccount, nil } @@ -116,7 +116,7 @@ func (r *Repository) CreateAccount(ctx context.Context, scopeId string, a *Accou func (r *Repository) LookupAccount(ctx context.Context, withPublicId string, opt ...Option) (*Account, error) { const op = "oidc.(Repository).LookupAccount" if withPublicId == "" { - return nil, errors.New(errors.InvalidPublicId, op, "missing public id") + return nil, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } a := AllocAccount() a.PublicId = withPublicId @@ -124,7 +124,7 @@ func (r *Repository) LookupAccount(ctx context.Context, withPublicId string, opt if errors.IsNotFoundError(err) { return nil, nil } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", withPublicId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", withPublicId))) } return a, nil } @@ -133,7 +133,7 @@ func (r *Repository) LookupAccount(ctx context.Context, withPublicId string, opt func (r *Repository) ListAccounts(ctx context.Context, withAuthMethodId string, opt ...Option) ([]*Account, error) { const op = "oidc.(Repository).ListAccounts" if withAuthMethodId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing auth method id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing auth method id") } opts := getOpts(opt...) limit := r.defaultLimit @@ -144,7 +144,7 @@ func (r *Repository) ListAccounts(ctx context.Context, withAuthMethodId string, var accts []*Account err := r.reader.SearchWhere(ctx, &accts, "auth_method_id = ?", []interface{}{withAuthMethodId}, db.WithLimit(limit)) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return accts, nil } @@ -154,17 +154,17 @@ func (r *Repository) ListAccounts(ctx context.Context, withAuthMethodId string, func (r *Repository) DeleteAccount(ctx context.Context, scopeId, withPublicId string, opt ...Option) (int, error) { const op = "oidc.(Repository).DeleteAccount" if withPublicId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidPublicId, op, "missing public id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } if scopeId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing scope id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } ac := AllocAccount() ac.PublicId = withPublicId oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get oplog wrapper")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get oplog wrapper")) } var rowsDeleted int @@ -177,17 +177,17 @@ func (r *Repository) DeleteAccount(ctx context.Context, scopeId, withPublicId st dAc := ac.Clone() rowsDeleted, err = w.Delete(ctx, dAc, db.WithOplog(oplogWrapper, metadata)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(withPublicId)) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(withPublicId)) } return rowsDeleted, nil @@ -207,19 +207,19 @@ func (r *Repository) DeleteAccount(ctx context.Context, scopeId, withPublicId st func (r *Repository) UpdateAccount(ctx context.Context, scopeId string, a *Account, version uint32, fieldMaskPaths []string, opt ...Option) (*Account, int, error) { const op = "oidc.(Repository).UpdateAccount" if a == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing Account") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing Account") } if a.Account == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing embedded Account") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing embedded Account") } if a.PublicId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidPublicId, op, "missing public id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } if version == 0 { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing version") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing version") } if scopeId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } for _, f := range fieldMaskPaths { @@ -227,7 +227,7 @@ func (r *Repository) UpdateAccount(ctx context.Context, scopeId string, a *Accou case strings.EqualFold(NameField, f): case strings.EqualFold(DescriptionField, f): default: - return nil, db.NoRowsAffected, errors.New(errors.InvalidFieldMask, op, f) + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidFieldMask, op, f) } } var dbMask, nullFields []string @@ -240,12 +240,12 @@ func (r *Repository) UpdateAccount(ctx context.Context, scopeId string, a *Accou nil, ) if len(dbMask) == 0 && len(nullFields) == 0 { - return nil, db.NoRowsAffected, errors.New(errors.EmptyFieldMask, op, "missing field mask") + return nil, db.NoRowsAffected, errors.New(ctx, errors.EmptyFieldMask, op, "missing field mask") } oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg(("unable to get oplog wrapper"))) } @@ -261,10 +261,10 @@ func (r *Repository) UpdateAccount(ctx context.Context, scopeId string, a *Accou var err error rowsUpdated, err = w.Update(ctx, returnedAccount, dbMask, nullFields, db.WithOplog(oplogWrapper, metadata), db.WithVersion(&version)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsUpdated > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been updated") } return nil }, @@ -272,10 +272,10 @@ func (r *Repository) UpdateAccount(ctx context.Context, scopeId string, a *Accou if err != nil { if errors.IsUniqueError(err) { - return nil, db.NoRowsAffected, errors.New(errors.NotUnique, op, + return nil, db.NoRowsAffected, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("name %s already exists: %s", a.Name, a.PublicId)) } - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(a.PublicId)) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(a.PublicId)) } return returnedAccount, rowsUpdated, nil diff --git a/internal/auth/oidc/repository_account_test.go b/internal/auth/oidc/repository_account_test.go index f2121b70b..443462d33 100644 --- a/internal/auth/oidc/repository_account_test.go +++ b/internal/auth/oidc/repository_account_test.go @@ -199,7 +199,7 @@ func TestRepository_CreateAccount(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) got, err := repo.CreateAccount(context.Background(), org.GetPublicId(), tt.in, tt.opts...) @@ -235,7 +235,7 @@ func TestRepository_CreateAccount_DuplicateFields(t *testing.T) { t.Run("invalid-duplicate-names", func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) @@ -275,7 +275,7 @@ func TestRepository_CreateAccount_DuplicateFields(t *testing.T) { t.Run("valid-duplicate-names-diff-parents", func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) @@ -328,7 +328,7 @@ func TestRepository_CreateAccount_DuplicateFields(t *testing.T) { t.Run("invalid-duplicate-subjects", func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) @@ -367,7 +367,7 @@ func TestRepository_CreateAccount_DuplicateFields(t *testing.T) { t.Run("valid-duplicate-subject-diff-authmethod", func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) @@ -423,7 +423,7 @@ func TestRepository_CreateAccount_DuplicateFields(t *testing.T) { t.Run("valid-duplicate-subject-diff-issuer", func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) @@ -496,7 +496,7 @@ func TestRepository_LookupAccount(t *testing.T) { ) account := TestAccount(t, conn, authMethod, "test-subject") - newAcctId, err := newAccountId(authMethod.GetPublicId(), authMethod.Issuer, "random-id") + newAcctId, err := newAccountId(ctx, authMethod.GetPublicId(), authMethod.Issuer, "random-id") require.NoError(t, err) tests := []struct { name string @@ -525,7 +525,7 @@ func TestRepository_LookupAccount(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) got, err := repo.LookupAccount(context.Background(), tt.in) @@ -560,7 +560,7 @@ func TestRepository_DeleteAccount(t *testing.T) { WithApiUrl(TestConvertToUrls(t, "https://www.alice.com/callback")[0]), ) account := TestAccount(t, conn, authMethod, "create-success") - newAcctId, err := newAccountId(authMethod.GetPublicId(), authMethod.Issuer, "random-subject") + newAcctId, err := newAccountId(ctx, authMethod.GetPublicId(), authMethod.Issuer, "random-subject") require.NoError(t, err) tests := []struct { name string @@ -601,7 +601,7 @@ func TestRepository_DeleteAccount(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) got, err := repo.DeleteAccount(context.Background(), tt.scopeId, tt.in) @@ -690,7 +690,7 @@ func TestRepository_ListAccounts(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) got, err := repo.ListAccounts(context.Background(), tt.in, tt.opts...) @@ -783,7 +783,7 @@ func TestRepository_ListAccounts_Limits(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache, tt.repoOpts...) + repo, err := NewRepository(ctx, rw, rw, kmsCache, tt.repoOpts...) assert.NoError(err) require.NotNil(repo) got, err := repo.ListAccounts(context.Background(), am.GetPublicId(), tt.listOpts...) @@ -1130,7 +1130,7 @@ func TestRepository_UpdateAccount(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) @@ -1188,7 +1188,7 @@ func TestRepository_UpdateAccount_DupeNames(t *testing.T) { t.Run("invalid-duplicate-names", func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) @@ -1227,7 +1227,7 @@ func TestRepository_UpdateAccount_DupeNames(t *testing.T) { t.Run("valid-duplicate-names-diff-AuthMethods", func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) @@ -1265,7 +1265,7 @@ func TestRepository_UpdateAccount_DupeNames(t *testing.T) { t.Run("change-authmethod-id", func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) diff --git a/internal/auth/oidc/repository_auth_method.go b/internal/auth/oidc/repository_auth_method.go index d153cf5ee..3b3e3e879 100644 --- a/internal/auth/oidc/repository_auth_method.go +++ b/internal/auth/oidc/repository_auth_method.go @@ -25,25 +25,25 @@ var _ proto.Message = (*Account)(nil) func (r *Repository) upsertAccount(ctx context.Context, am *AuthMethod, IdTokenClaims, AccessTokenClaims map[string]interface{}) (*Account, error) { const op = "oidc.(Repository).upsertAccount" if am == nil || am.AuthMethod == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing auth method") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing auth method") } if IdTokenClaims == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing ID Token claims") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing ID Token claims") } if AccessTokenClaims == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing Access Token claims") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing Access Token claims") } fromSub, fromName, fromEmail := string(ToSubClaim), string(ToNameClaim), string(ToEmailClaim) if len(am.AccountClaimMaps) > 0 { - acms, err := ParseAccountClaimMaps(am.AccountClaimMaps...) + acms, err := ParseAccountClaimMaps(ctx, am.AccountClaimMaps...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } for _, m := range acms { - toClaim, err := ConvertToAccountToClaim(m.To) + toClaim, err := ConvertToAccountToClaim(ctx, m.To) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } switch toClaim { case ToSubClaim: @@ -54,7 +54,7 @@ func (r *Repository) upsertAccount(ctx context.Context, am *AuthMethod, IdTokenC fromName = m.From default: // should never happen, but including it just in case. - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("%s=%s is not a valid account claim map", m.From, m.To)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s=%s is not a valid account claim map", m.From, m.To)) } } } @@ -62,14 +62,14 @@ func (r *Repository) upsertAccount(ctx context.Context, am *AuthMethod, IdTokenC var iss, sub string var ok bool if iss, ok = IdTokenClaims["iss"].(string); !ok { - return nil, errors.New(errors.Unknown, op, "issuer is not present in ID Token, which should not be possible") + return nil, errors.New(ctx, errors.Unknown, op, "issuer is not present in ID Token, which should not be possible") } if sub, ok = IdTokenClaims[fromSub].(string); !ok { - return nil, errors.New(errors.Unknown, op, fmt.Sprintf("mapping 'claim' %s to account subject and it is not present in ID Token", fromSub)) + return nil, errors.New(ctx, errors.Unknown, op, fmt.Sprintf("mapping 'claim' %s to account subject and it is not present in ID Token", fromSub)) } - pubId, err := newAccountId(am.GetPublicId(), iss, sub) + pubId, err := newAccountId(ctx, am.GetPublicId(), iss, sub) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } columns := []string{"public_id", "auth_method_id", "issuer", "subject"} @@ -79,7 +79,7 @@ func (r *Repository) upsertAccount(ctx context.Context, am *AuthMethod, IdTokenC { marshaledTokenClaims, err := json.Marshal(IdTokenClaims) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } columns, values = append(columns, "token_claims"), append(values, string(marshaledTokenClaims)) conflictClauses = append(conflictClauses, fmt.Sprintf("token_claims = $%d", len(values))) @@ -88,7 +88,7 @@ func (r *Repository) upsertAccount(ctx context.Context, am *AuthMethod, IdTokenC { marshaledAccessTokenClaims, err := json.Marshal(AccessTokenClaims) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } columns, values = append(columns, "userinfo_claims"), append(values, string(marshaledAccessTokenClaims)) conflictClauses = append(conflictClauses, fmt.Sprintf("userinfo_claims = $%d", len(values))) @@ -97,11 +97,11 @@ func (r *Repository) upsertAccount(ctx context.Context, am *AuthMethod, IdTokenC issAsUrl, err := url.Parse(iss) if err != nil { - return nil, errors.New(errors.Unknown, op, "unable to parse issuer", errors.WithWrap(err)) + return nil, errors.New(ctx, errors.Unknown, op, "unable to parse issuer", errors.WithWrap(err)) } - acctForOplog, err := NewAccount(am.PublicId, sub, WithIssuer(issAsUrl)) + acctForOplog, err := NewAccount(ctx, am.PublicId, sub, WithIssuer(issAsUrl)) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create new acct for oplog")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create new acct for oplog")) } var foundName interface{} @@ -148,7 +148,7 @@ func (r *Repository) upsertAccount(ctx context.Context, am *AuthMethod, IdTokenC oplogWrapper, err := r.kms.GetWrapper(ctx, am.ScopeId, kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } updatedAcct := AllocAccount() @@ -160,7 +160,7 @@ func (r *Repository) upsertAccount(ctx context.Context, am *AuthMethod, IdTokenC var err error rows, err := w.Query(ctx, query, values) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to insert/update auth oidc account")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to insert/update auth oidc account")) } defer rows.Close() result := struct { @@ -172,19 +172,19 @@ func (r *Repository) upsertAccount(ctx context.Context, am *AuthMethod, IdTokenC rowCnt += 1 err = r.reader.ScanRows(rows, &result) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to scan rows for account")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to scan rows for account")) } } if rowCnt > 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("expected 1 row but got: %d", rowCnt)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("expected 1 row but got: %d", rowCnt)) } if err := reader.LookupWhere(ctx, &updatedAcct, "auth_method_id = ? and issuer = ? and subject = ?", am.PublicId, iss, sub); err != nil { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to look up auth oidc account for: %s / %s / %s", am.PublicId, iss, sub))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to look up auth oidc account for: %s / %s / %s", am.PublicId, iss, sub))) } // include the version incase of predictable account public ids based on a calculation using authmethod id and subject if result.Version == 1 && updatedAcct.PublicId == pubId { if err := upsertOplog(ctx, w, oplogWrapper, oplog.OpType_OP_TYPE_CREATE, am.ScopeId, updatedAcct, nil, nil); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write create oplog for account")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write create oplog for account")) } } else { if len(fieldMasks) > 0 || len(nullMasks) > 0 { @@ -197,7 +197,7 @@ func (r *Repository) upsertAccount(ctx context.Context, am *AuthMethod, IdTokenC acctForOplog.FullName = foundName.(string) } if err := upsertOplog(ctx, w, oplogWrapper, oplog.OpType_OP_TYPE_UPDATE, am.ScopeId, acctForOplog, fieldMasks, nullMasks); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write update oplog for account")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write update oplog for account")) } } } @@ -205,7 +205,7 @@ func (r *Repository) upsertAccount(ctx context.Context, am *AuthMethod, IdTokenC }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return updatedAcct, nil } @@ -215,35 +215,35 @@ func (r *Repository) upsertAccount(ctx context.Context, am *AuthMethod, IdTokenC func upsertOplog(ctx context.Context, w db.Writer, oplogWrapper wrapping.Wrapper, operation oplog.OpType, scopeId string, acct *Account, fieldMasks, nullMasks []string) error { const op = "oidc.upsertOplog" if w == nil { - return errors.New(errors.InvalidParameter, op, "missing db writer") + return errors.New(ctx, errors.InvalidParameter, op, "missing db writer") } if oplogWrapper == nil { - return errors.New(errors.InvalidParameter, op, "missing oplog wrapper") + return errors.New(ctx, errors.InvalidParameter, op, "missing oplog wrapper") } if operation != oplog.OpType_OP_TYPE_CREATE && operation != oplog.OpType_OP_TYPE_UPDATE { - return errors.New(errors.Internal, op, fmt.Sprintf("not a supported operation: %s", operation)) + return errors.New(ctx, errors.Internal, op, fmt.Sprintf("not a supported operation: %s", operation)) } if scopeId == "" { - return errors.New(errors.InvalidParameter, op, "missing scope id") + return errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } if acct == nil || acct.Account == nil { - return errors.New(errors.InvalidParameter, op, "missing account") + return errors.New(ctx, errors.InvalidParameter, op, "missing account") } if operation == oplog.OpType_OP_TYPE_UPDATE && len(fieldMasks) == 0 && len(nullMasks) == 0 { - return errors.New(errors.InvalidParameter, op, "update operations must specify field masks and/or null masks") + return errors.New(ctx, errors.InvalidParameter, op, "update operations must specify field masks and/or null masks") } ticket, err := w.GetTicket(acct) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } metadata := acct.oplog(operation, scopeId) acctAsReplayable, ok := interface{}(acct).(oplog.ReplayableMessage) if !ok { - return errors.New(errors.Internal, op, "account is not replayable") + return errors.New(ctx, errors.Internal, op, "account is not replayable") } acctAsProto, ok := interface{}(acct).(proto.Message) if !ok { - return errors.New(errors.Internal, op, "account is not a proto message") + return errors.New(ctx, errors.Internal, op, "account is not a proto message") } msg := oplog.Message{ Message: acctAsProto, @@ -253,7 +253,7 @@ func upsertOplog(ctx context.Context, w db.Writer, oplogWrapper wrapping.Wrapper SetToNullPaths: nullMasks, } if err := w.WriteOplogEntryWith(ctx, oplogWrapper, ticket, metadata, []*oplog.Message{&msg}); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } diff --git a/internal/auth/oidc/repository_auth_method_create.go b/internal/auth/oidc/repository_auth_method_create.go index bd073750b..67ba95de4 100644 --- a/internal/auth/oidc/repository_auth_method_create.go +++ b/internal/auth/oidc/repository_auth_method_create.go @@ -21,48 +21,48 @@ import ( func (r *Repository) CreateAuthMethod(ctx context.Context, am *AuthMethod, opt ...Option) (*AuthMethod, error) { const op = "oidc.(Repository).CreateAuthMethod" if am == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing auth method") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing auth method") } if am.PublicId != "" { - return nil, errors.New(errors.InvalidParameter, op, "public id must be empty") + return nil, errors.New(ctx, errors.InvalidParameter, op, "public id must be empty") } if am.Version != 0 { - return nil, errors.New(errors.InvalidParameter, op, "version must be empty") + return nil, errors.New(ctx, errors.InvalidParameter, op, "version must be empty") } - if err := am.validate(op); err != nil { + if err := am.validate(ctx, op); err != nil { return nil, err // validate properly sets the op to the caller, the code and the msg, so just return it. } opts := getOpts(opt...) am.PublicId = opts.withPublicId if am.PublicId == "" { - id, err := newAuthMethodId() + id, err := newAuthMethodId(ctx) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } am.PublicId = id } else { if !strings.HasPrefix(am.PublicId, AuthMethodPrefix+"_") { - return nil, errors.New(errors.InvalidParameter, op, "wrong auth method id prefix") + return nil, errors.New(ctx, errors.InvalidParameter, op, "wrong auth method id prefix") } } - vo, err := am.convertValueObjects() + vo, err := am.convertValueObjects(ctx) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } oplogWrapper, err := r.kms.GetWrapper(ctx, am.ScopeId, kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } databaseWrapper, err := r.kms.GetWrapper(context.Background(), am.ScopeId, kms.KeyPurposeDatabase) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get database wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get database wrapper")) } if err := am.encrypt(ctx, databaseWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } var returnedAuthMethod *AuthMethod @@ -74,7 +74,7 @@ func (r *Repository) CreateAuthMethod(ctx context.Context, am *AuthMethod, opt . msgs := make([]*oplog.Message, 0, 5) ticket, err := w.GetTicket(am) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } returnedAuthMethod = am.Clone() @@ -121,13 +121,13 @@ func (r *Repository) CreateAuthMethod(ctx context.Context, am *AuthMethod, opt . } metadata := am.oplog(oplog.OpType_OP_TYPE_CREATE) if err := w.WriteOplogEntryWith(ctx, oplogWrapper, ticket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return returnedAuthMethod, nil } diff --git a/internal/auth/oidc/repository_auth_method_create_test.go b/internal/auth/oidc/repository_auth_method_create_test.go index 11ea6e5f2..3a2f91740 100644 --- a/internal/auth/oidc/repository_auth_method_create_test.go +++ b/internal/auth/oidc/repository_auth_method_create_test.go @@ -50,6 +50,7 @@ func TestRepository_CreateAuthMethod(t *testing.T) { certs := []*x509.Certificate{cert1, cert2} pems := []string{pem1, pem2} am, err := NewAuthMethod( + ctx, org.PublicId, "alice-rp", "alice-secret", WithAudClaims("alice-rp"), @@ -84,6 +85,7 @@ func TestRepository_CreateAuthMethod(t *testing.T) { certs := []*x509.Certificate{cert1, cert2} pems := []string{pem1, pem2} am, err := NewAuthMethod( + ctx, org.PublicId, "alice-rp-custom", "alice-secret-custom", WithAudClaims("alice-rp-custom"), @@ -119,6 +121,7 @@ func TestRepository_CreateAuthMethod(t *testing.T) { certs := []*x509.Certificate{cert1, cert2} pems := []string{pem1, pem2} am, err := NewAuthMethod( + ctx, org.PublicId, "alice-rp-bad", "alice-secret-bad", WithAudClaims("alice-rp-bad"), @@ -147,7 +150,7 @@ func TestRepository_CreateAuthMethod(t *testing.T) { { name: "bad-state", am: func(t *testing.T) *AuthMethod { - am, err := NewAuthMethod(org.PublicId, "bad-state-rp", "alice-secret", + am, err := NewAuthMethod(ctx, org.PublicId, "bad-state-rp", "alice-secret", WithAudClaims("alice-rp"), WithApiUrl(TestConvertToUrls(t, "https://api.com")[0])) require.NoError(t, err) am.OperationalState = "not-a-valid-state" @@ -165,7 +168,7 @@ func TestRepository_CreateAuthMethod(t *testing.T) { { name: "bad-public-id", am: func(t *testing.T) *AuthMethod { - id, err := newAuthMethodId() + id, err := newAuthMethodId(ctx) require.NoError(t, err) am := AllocAuthMethod() am.PublicId = id @@ -186,7 +189,7 @@ func TestRepository_CreateAuthMethod(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) am := tt.am(t) diff --git a/internal/auth/oidc/repository_auth_method_delete.go b/internal/auth/oidc/repository_auth_method_delete.go index 47e12dc0a..0b8cfa8c9 100644 --- a/internal/auth/oidc/repository_auth_method_delete.go +++ b/internal/auth/oidc/repository_auth_method_delete.go @@ -16,11 +16,11 @@ import ( func (r *Repository) DeleteAuthMethod(ctx context.Context, publicId string, _ ...Option) (int, error) { const op = "oidc.(Repository).DeleteAuthMethod" if publicId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidPublicId, op, "missing public id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } am, err := r.LookupAuthMethod(ctx, publicId) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op) + return db.NoRowsAffected, errors.Wrap(ctx, err, op) } if am == nil { // already deleted and this is not an error. @@ -29,7 +29,7 @@ func (r *Repository) DeleteAuthMethod(ctx context.Context, publicId string, _ .. oplogWrapper, err := r.kms.GetWrapper(ctx, am.ScopeId, kms.KeyPurposeOplog) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } metadata := am.oplog(oplog.OpType_OP_TYPE_DELETE) var rowsDeleted int @@ -44,13 +44,13 @@ func (r *Repository) DeleteAuthMethod(ctx context.Context, publicId string, _ .. return err } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 auth method would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 auth method would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to delete %s", publicId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to delete %s", publicId))) } return rowsDeleted, nil } diff --git a/internal/auth/oidc/repository_auth_method_delete_test.go b/internal/auth/oidc/repository_auth_method_delete_test.go index ffa3badc6..1696487ba 100644 --- a/internal/auth/oidc/repository_auth_method_delete_test.go +++ b/internal/auth/oidc/repository_auth_method_delete_test.go @@ -48,7 +48,7 @@ func TestRepository_DeleteAuthMethod(t *testing.T) { authMethod: func() *AuthMethod { am := AllocAuthMethod() var err error - am.PublicId, err = newAuthMethodId() + am.PublicId, err = newAuthMethodId(ctx) require.NoError(t, err) return &am }(), @@ -57,7 +57,7 @@ func TestRepository_DeleteAuthMethod(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) require.NoError(err) deletedRows, err := repo.DeleteAuthMethod(ctx, tt.authMethod.PublicId) if tt.wantErrMatch != nil { diff --git a/internal/auth/oidc/repository_auth_method_operational_state.go b/internal/auth/oidc/repository_auth_method_operational_state.go index a1e86abde..caa86c033 100644 --- a/internal/auth/oidc/repository_auth_method_operational_state.go +++ b/internal/auth/oidc/repository_auth_method_operational_state.go @@ -17,7 +17,7 @@ func (r *Repository) MakeInactive(ctx context.Context, authMethodId string, vers const op = "oidc.(Repository).MakeInactive" updated, err := r.transitionAuthMethodTo(ctx, authMethodId, InactiveState, version) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return updated, nil } @@ -32,7 +32,7 @@ func (r *Repository) MakePrivate(ctx context.Context, authMethodId string, versi const op = "oidc.(Repository).MakePrivate" updated, err := r.transitionAuthMethodTo(ctx, authMethodId, ActivePrivateState, version, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return updated, nil } @@ -47,7 +47,7 @@ func (r *Repository) MakePublic(ctx context.Context, authMethodId string, versio const op = "oidc.(Repository).MakePublic" updated, err := r.transitionAuthMethodTo(ctx, authMethodId, ActivePublicState, version, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return updated, nil } @@ -55,17 +55,17 @@ func (r *Repository) MakePublic(ctx context.Context, authMethodId string, versio func (r *Repository) transitionAuthMethodTo(ctx context.Context, authMethodId string, desiredState AuthMethodState, version uint32, opt ...Option) (*AuthMethod, error) { const op = "oidc.(Repository).transitionAuthMethodTo" if authMethodId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing auth method id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing auth method id") } if !validState(string(desiredState)) { - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("%s is not a valid auth method state", desiredState)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s is not a valid auth method state", desiredState)) } am, err := r.lookupAuthMethod(ctx, authMethodId) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if am == nil { - return nil, errors.New(errors.RecordNotFound, op, fmt.Sprintf("%s auth method not found", authMethodId)) + return nil, errors.New(ctx, errors.RecordNotFound, op, fmt.Sprintf("%s auth method not found", authMethodId)) } opts := getOpts(opt...) if am.OperationalState == string(desiredState) && am.DisableDiscoveredConfigValidation == opts.withForce { @@ -76,17 +76,17 @@ func (r *Repository) transitionAuthMethodTo(ctx context.Context, authMethodId st updatedAm := am.Clone() updatedAm.OperationalState = string(desiredState) if err := r.ValidateDiscoveryInfo(ctx, WithAuthMethod(updatedAm)); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } } - if err := am.isComplete(); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to transition from %s to %s", InactiveState, desiredState))) + if err := am.isComplete(ctx); err != nil { + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to transition from %s to %s", InactiveState, desiredState))) } } oplogWrapper, err := r.kms.GetWrapper(ctx, am.ScopeId, kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var updatedAm *AuthMethod @@ -102,14 +102,14 @@ func (r *Repository) transitionAuthMethodTo(ctx context.Context, authMethodId st rowsUpdated, err := w.Update(ctx, updatedAm, dbMask, nil, db.WithOplog(oplogWrapper, updatedAm.oplog(oplog.OpType_OP_TYPE_UPDATE)), db.WithVersion(&version)) switch { case err != nil: - return errors.Wrap(err, op, errors.WithMsg("unable to update auth method")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update auth method")) case err == nil && rowsUpdated > 1: - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated auth method and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated auth method and %d rows updated", rowsUpdated)) case err == nil && rowsUpdated == 0: // this is different than how "no rows updated" is handled in // the typical update pattern since we are not returning the // number of rows updated, we need to raise an error here. - return errors.New(errors.RecordNotFound, op, fmt.Sprintf("updated auth method and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.RecordNotFound, op, fmt.Sprintf("updated auth method and %d rows updated", rowsUpdated)) default: } // we need a new repo, that's using the same reader/writer as this TxHandler @@ -122,16 +122,16 @@ func (r *Repository) transitionAuthMethodTo(ctx context.Context, authMethodId st } updatedAm, err = txRepo.lookupAuthMethod(ctx, updatedAm.PublicId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to lookup auth method after update")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to lookup auth method after update")) } if updatedAm == nil { - return errors.New(errors.RecordNotFound, op, "unable to lookup auth method after update") + return errors.New(ctx, errors.RecordNotFound, op, "unable to lookup auth method after update") } return err }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return updatedAm, nil } diff --git a/internal/auth/oidc/repository_auth_method_operational_state_test.go b/internal/auth/oidc/repository_auth_method_operational_state_test.go index 23b598915..bb744571a 100644 --- a/internal/auth/oidc/repository_auth_method_operational_state_test.go +++ b/internal/auth/oidc/repository_auth_method_operational_state_test.go @@ -27,12 +27,12 @@ func Test_MakeInactive_MakePrivate_MakePublic(t *testing.T) { tpClientSecret := "her-dog's-name" tp.SetClientCreds(tpClientId, tpClientSecret) _, _, tpAlg, _ := tp.SigningKeys() - tpCert, err := ParseCertificates(tp.CACert()) + tpCert, err := ParseCertificates(ctx, tp.CACert()) require.NoError(t, err) require.Equal(t, 1, len(tpCert)) rw := db.New(conn) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) require.NoError(t, err) tests := []struct { diff --git a/internal/auth/oidc/repository_auth_method_read.go b/internal/auth/oidc/repository_auth_method_read.go index e4d22a6b8..35d86f8e8 100644 --- a/internal/auth/oidc/repository_auth_method_read.go +++ b/internal/auth/oidc/repository_auth_method_read.go @@ -20,7 +20,7 @@ import ( func (r *Repository) LookupAuthMethod(ctx context.Context, publicId string, opt ...Option) (*AuthMethod, error) { const op = "oidc.(Repository).LookupAuthMethod" if publicId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing public id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } opts := getOpts(opt...) return r.lookupAuthMethod(ctx, publicId, WithUnauthenticatedUser(opts.withUnauthenticatedUser)) @@ -32,11 +32,11 @@ func (r *Repository) LookupAuthMethod(ctx context.Context, publicId string, opt func (r *Repository) ListAuthMethods(ctx context.Context, scopeIds []string, opt ...Option) ([]*AuthMethod, error) { const op = "oidc.(Repository).ListAuthMethods" if len(scopeIds) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing scope IDs") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope IDs") } authMethods, err := r.getAuthMethods(ctx, "", scopeIds, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return authMethods, nil } @@ -47,13 +47,13 @@ func (r *Repository) lookupAuthMethod(ctx context.Context, authMethodId string, var err error ams, err := r.getAuthMethods(ctx, authMethodId, nil, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } switch { case len(ams) == 0: return nil, nil // not an error to return no rows for a "lookup" case len(ams) > 1: - return nil, errors.New(errors.NotSpecificIntegrity, op, fmt.Sprintf("%s matched more than 1 ", authMethodId)) + return nil, errors.New(ctx, errors.NotSpecificIntegrity, op, fmt.Sprintf("%s matched more than 1 ", authMethodId)) default: return ams[0], nil } @@ -73,10 +73,10 @@ func (r *Repository) lookupAuthMethod(ctx context.Context, authMethodId string, func (r *Repository) getAuthMethods(ctx context.Context, authMethodId string, scopeIds []string, opt ...Option) ([]*AuthMethod, error) { const op = "oidc.(Repository).getAuthMethods" if authMethodId == "" && len(scopeIds) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing search criteria: both auth method id and Scope IDs are empty") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing search criteria: both auth method id and Scope IDs are empty") } if authMethodId != "" && len(scopeIds) > 0 { - return nil, errors.New(errors.InvalidParameter, op, "searching for both an auth method id and Scope IDs is not supported") + return nil, errors.New(ctx, errors.InvalidParameter, op, "searching for both an auth method id and Scope IDs is not supported") } const aggregateDelimiter = "|" @@ -114,7 +114,7 @@ func (r *Repository) getAuthMethods(ctx context.Context, authMethodId string, sc var aggAuthMethods []*authMethodAgg err := r.reader.SearchWhere(ctx, &aggAuthMethods, strings.Join(where, " and "), args, dbArgs...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if len(aggAuthMethods) == 0 { // we're done if nothing is found. @@ -125,10 +125,10 @@ func (r *Repository) getAuthMethods(ctx context.Context, authMethodId string, sc for _, agg := range aggAuthMethods { databaseWrapper, err := r.kms.GetWrapper(ctx, agg.ScopeId, kms.KeyPurposeDatabase, kms.WithKeyId(agg.KeyId)) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get database wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get database wrapper")) } if err := structwrapping.UnwrapStruct(ctx, databaseWrapper, agg, nil); err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.Decrypt)) + return nil, errors.Wrap(ctx, err, op, errors.WithCode(errors.Decrypt)) } am := AllocAuthMethod() am.PublicId = agg.PublicId diff --git a/internal/auth/oidc/repository_auth_method_read_test.go b/internal/auth/oidc/repository_auth_method_read_test.go index 9bbe04654..5ee1d8680 100644 --- a/internal/auth/oidc/repository_auth_method_read_test.go +++ b/internal/auth/oidc/repository_auth_method_read_test.go @@ -43,7 +43,7 @@ func TestRepository_LookupAuthMethod(t *testing.T) { amActivePub.IsPrimaryAuthMethod = true iam.TestSetPrimaryAuthMethod(t, iam.TestRepo(t, conn, wrapper), org, amActivePub.PublicId) - amId, err := newAuthMethodId() + amId, err := newAuthMethodId(ctx) require.NoError(t, err) tests := []struct { name string @@ -91,7 +91,7 @@ func TestRepository_LookupAuthMethod(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) got, err := repo.LookupAuthMethod(ctx, tt.in, tt.opt...) @@ -162,7 +162,7 @@ func TestRepository_ListAuthMethods(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) scopeIds, want, wantPrimaryAuthMethodId := tt.setupFn() @@ -344,7 +344,7 @@ func TestRepository_getAuthMethods(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - r, err := NewRepository(rw, rw, kmsCache) + r, err := NewRepository(ctx, rw, rw, kmsCache) require.NoError(err) authMethodId, scopeIds, want := tt.setupFn() diff --git a/internal/auth/oidc/repository_auth_method_test.go b/internal/auth/oidc/repository_auth_method_test.go index cf1067808..80e0b467a 100644 --- a/internal/auth/oidc/repository_auth_method_test.go +++ b/internal/auth/oidc/repository_auth_method_test.go @@ -25,7 +25,7 @@ func Test_upsertAccount(t *testing.T) { kmsCache := kms.TestKms(t, conn, rootWrapper) rw := db.New(conn) - r, err := NewRepository(rw, rw, kmsCache) + r, err := NewRepository(ctx, rw, rw, kmsCache) require.NoError(t, err) org, _ := iam.TestScopes(t, iam.TestRepo(t, conn, rootWrapper)) diff --git a/internal/auth/oidc/repository_auth_method_update.go b/internal/auth/oidc/repository_auth_method_update.go index 477b53aa8..e7891388d 100644 --- a/internal/auth/oidc/repository_auth_method_update.go +++ b/internal/auth/oidc/repository_auth_method_update.go @@ -78,17 +78,17 @@ const ( func (r *Repository) UpdateAuthMethod(ctx context.Context, am *AuthMethod, version uint32, fieldMaskPaths []string, opt ...Option) (*AuthMethod, int, error) { const op = "oidc.(Repository).UpdateAuthMethod" if am == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing auth method") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing auth method") } if am.AuthMethod == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing auth method store") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing auth method store") } if am.PublicId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing public id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } - if err := validateFieldMask(fieldMaskPaths); err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + if err := validateFieldMask(ctx, fieldMaskPaths); err != nil { + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } dbMask, nullFields := dbcommon.BuildUpdatePaths( @@ -110,25 +110,25 @@ func (r *Repository) UpdateAuthMethod(ctx context.Context, am *AuthMethod, versi nil, ) if len(dbMask) == 0 && len(nullFields) == 0 { - return nil, db.NoRowsAffected, errors.New(errors.EmptyFieldMask, op, "empty field mask") + return nil, db.NoRowsAffected, errors.New(ctx, errors.EmptyFieldMask, op, "empty field mask") } origAm, err := r.lookupAuthMethod(ctx, am.PublicId) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } if origAm == nil { - return nil, db.NoRowsAffected, errors.New(errors.RecordNotFound, op, fmt.Sprintf("auth method %s", am.PublicId)) + return nil, db.NoRowsAffected, errors.New(ctx, errors.RecordNotFound, op, fmt.Sprintf("auth method %s", am.PublicId)) } // there's no reason to continue if another controller has already updated this auth method. if origAm.Version != version { - return nil, db.NoRowsAffected, errors.New(errors.VersionMismatch, op, fmt.Sprintf("update version %d doesn't match db version %d", version, origAm.Version)) + return nil, db.NoRowsAffected, errors.New(ctx, errors.VersionMismatch, op, fmt.Sprintf("update version %d doesn't match db version %d", version, origAm.Version)) } opts := getOpts(opt...) if opts.withDryRun { updated := applyUpdate(am, origAm, fieldMaskPaths) - if err := updated.isComplete(); err != nil { + if err := updated.isComplete(ctx); err != nil { return updated, db.NoRowsAffected, err } err := r.ValidateDiscoveryInfo(ctx, WithAuthMethod(updated)) @@ -138,40 +138,40 @@ func (r *Repository) UpdateAuthMethod(ctx context.Context, am *AuthMethod, versi // prevent an "active" auth method from being updated in a manner that would create // an incomplete and unusable auth method. if origAm.OperationalState != string(InactiveState) { - if err := applyUpdate(am, origAm, fieldMaskPaths).isComplete(); err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("update would result in an incomplete auth method")) + if err := applyUpdate(am, origAm, fieldMaskPaths).isComplete(ctx); err != nil { + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("update would result in an incomplete auth method")) } } if !opts.withForce { if err := r.ValidateDiscoveryInfo(ctx, WithAuthMethod(applyUpdate(am, origAm, fieldMaskPaths))); err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } } - addAlgs, deleteAlgs, err := valueObjectChanges(origAm.PublicId, SigningAlgVO, am.SigningAlgs, origAm.SigningAlgs, dbMask, nullFields) + addAlgs, deleteAlgs, err := valueObjectChanges(ctx, origAm.PublicId, SigningAlgVO, am.SigningAlgs, origAm.SigningAlgs, dbMask, nullFields) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } - addCerts, deleteCerts, err := valueObjectChanges(origAm.PublicId, CertificateVO, am.Certificates, origAm.Certificates, dbMask, nullFields) + addCerts, deleteCerts, err := valueObjectChanges(ctx, origAm.PublicId, CertificateVO, am.Certificates, origAm.Certificates, dbMask, nullFields) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } - addAuds, deleteAuds, err := valueObjectChanges(origAm.PublicId, AudClaimVO, am.AudClaims, origAm.AudClaims, dbMask, nullFields) + addAuds, deleteAuds, err := valueObjectChanges(ctx, origAm.PublicId, AudClaimVO, am.AudClaims, origAm.AudClaims, dbMask, nullFields) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } - addScopes, deleteScopes, err := valueObjectChanges(origAm.PublicId, ClaimsScopesVO, am.ClaimsScopes, origAm.ClaimsScopes, dbMask, nullFields) + addScopes, deleteScopes, err := valueObjectChanges(ctx, origAm.PublicId, ClaimsScopesVO, am.ClaimsScopes, origAm.ClaimsScopes, dbMask, nullFields) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } - addMaps, deleteMaps, err := valueObjectChanges(origAm.PublicId, AccountClaimMapsVO, am.AccountClaimMaps, origAm.AccountClaimMaps, dbMask, nullFields) + addMaps, deleteMaps, err := valueObjectChanges(ctx, origAm.PublicId, AccountClaimMapsVO, am.AccountClaimMaps, origAm.AccountClaimMaps, dbMask, nullFields) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } // we don't allow updates for "sub" claim maps, because we have no way to // determine if the updated "from" claim in the map might create collisions @@ -179,13 +179,13 @@ func (r *Repository) UpdateAuthMethod(ctx context.Context, am *AuthMethod, versi for _, rawCm := range addMaps { cm := rawCm.(*AccountClaimMap) if cm.ToClaim == string(ToSubClaim) { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, fmt.Sprintf("you cannot update account claim map %s=%s for the \"sub\" claim", cm.FromClaim, cm.ToClaim)) + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("you cannot update account claim map %s=%s for the \"sub\" claim", cm.FromClaim, cm.ToClaim)) } } for _, rawCm := range deleteMaps { cm := rawCm.(*AccountClaimMap) if cm.ToClaim == string(ToSubClaim) { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, fmt.Sprintf("you cannot update account claim map %s=%s for the \"sub\" claim", cm.FromClaim, cm.ToClaim)) + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("you cannot update account claim map %s=%s for the \"sub\" claim", cm.FromClaim, cm.ToClaim)) } } @@ -234,15 +234,15 @@ func (r *Repository) UpdateAuthMethod(ctx context.Context, am *AuthMethod, versi databaseWrapper, err := r.kms.GetWrapper(ctx, origAm.ScopeId, kms.KeyPurposeDatabase) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get database wrapper")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get database wrapper")) } if err := am.encrypt(ctx, databaseWrapper); err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } oplogWrapper, err := r.kms.GetWrapper(ctx, origAm.ScopeId, kms.KeyPurposeOplog) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } // we always set this to the current value of opts.withForce @@ -258,7 +258,7 @@ func (r *Repository) UpdateAuthMethod(ctx context.Context, am *AuthMethod, versi msgs := make([]*oplog.Message, 0, 7) // AuthMethod, Algs*2, Certs*2, Audiences*2 ticket, err := w.GetTicket(am) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } var authMethodOplogMsg oplog.Message switch { @@ -269,20 +269,20 @@ func (r *Repository) UpdateAuthMethod(ctx context.Context, am *AuthMethod, versi updatedAm.Version = uint32(version) + 1 rowsUpdated, err = w.Update(ctx, updatedAm, []string{VersionField, DisableDiscoveredConfigValidationField}, nil, db.NewOplogMsg(&authMethodOplogMsg), db.WithVersion(&version)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update auth method version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update auth method version")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated auth method version and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated auth method version and %d rows updated", rowsUpdated)) } default: filteredDbMask = append(filteredDbMask, DisableDiscoveredConfigValidationField) updatedAm = am.Clone() rowsUpdated, err = w.Update(ctx, updatedAm, filteredDbMask, filteredNullFields, db.NewOplogMsg(&authMethodOplogMsg), db.WithVersion(&version)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update auth method")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update auth method")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated auth method and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated auth method and %d rows updated", rowsUpdated)) } } msgs = append(msgs, &authMethodOplogMsg) @@ -291,17 +291,17 @@ func (r *Repository) UpdateAuthMethod(ctx context.Context, am *AuthMethod, versi deleteAlgOplogMsgs := make([]*oplog.Message, 0, len(deleteAlgs)) rowsDeleted, err := w.DeleteItems(ctx, deleteAlgs, db.NewOplogMsgs(&deleteAlgOplogMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete signing algorithms")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete signing algorithms")) } if rowsDeleted != len(deleteAlgs) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("signing algorithms deleted %d did not match request for %d", rowsDeleted, len(deleteAlgs))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("signing algorithms deleted %d did not match request for %d", rowsDeleted, len(deleteAlgs))) } msgs = append(msgs, deleteAlgOplogMsgs...) } if len(addAlgs) > 0 { addAlgsOplogMsgs := make([]*oplog.Message, 0, len(addAlgs)) if err := w.CreateItems(ctx, addAlgs, db.NewOplogMsgs(&addAlgsOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add signing algorithms")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add signing algorithms")) } msgs = append(msgs, addAlgsOplogMsgs...) } @@ -310,17 +310,17 @@ func (r *Repository) UpdateAuthMethod(ctx context.Context, am *AuthMethod, versi deleteCertOplogMsgs := make([]*oplog.Message, 0, len(deleteCerts)) rowsDeleted, err := w.DeleteItems(ctx, deleteCerts, db.NewOplogMsgs(&deleteCertOplogMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete certificates")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete certificates")) } if rowsDeleted != len(deleteCerts) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("certificates deleted %d did not match request for %d", rowsDeleted, len(deleteCerts))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("certificates deleted %d did not match request for %d", rowsDeleted, len(deleteCerts))) } msgs = append(msgs, deleteCertOplogMsgs...) } if len(addCerts) > 0 { addCertsOplogMsgs := make([]*oplog.Message, 0, len(addCerts)) if err := w.CreateItems(ctx, addCerts, db.NewOplogMsgs(&addCertsOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add certificates")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add certificates")) } msgs = append(msgs, addCertsOplogMsgs...) } @@ -329,17 +329,17 @@ func (r *Repository) UpdateAuthMethod(ctx context.Context, am *AuthMethod, versi deleteAudsOplogMsgs := make([]*oplog.Message, 0, len(deleteAuds)) rowsDeleted, err := w.DeleteItems(ctx, deleteAuds, db.NewOplogMsgs(&deleteAudsOplogMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete audiences URLs")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete audiences URLs")) } if rowsDeleted != len(deleteAuds) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("audiences deleted %d did not match request for %d", rowsDeleted, len(deleteAuds))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("audiences deleted %d did not match request for %d", rowsDeleted, len(deleteAuds))) } msgs = append(msgs, deleteAudsOplogMsgs...) } if len(addAuds) > 0 { addAudsOplogMsgs := make([]*oplog.Message, 0, len(addAuds)) if err := w.CreateItems(ctx, addAuds, db.NewOplogMsgs(&addAudsOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add audiences URLs")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add audiences URLs")) } msgs = append(msgs, addAudsOplogMsgs...) } @@ -348,17 +348,17 @@ func (r *Repository) UpdateAuthMethod(ctx context.Context, am *AuthMethod, versi deleteScopesOplogMsgs := make([]*oplog.Message, 0, len(deleteScopes)) rowsDeleted, err := w.DeleteItems(ctx, deleteScopes, db.NewOplogMsgs(&deleteScopesOplogMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete claims scopes")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete claims scopes")) } if rowsDeleted != len(deleteScopes) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("claims scopes deleted %d did not match request for %d", rowsDeleted, len(deleteScopes))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("claims scopes deleted %d did not match request for %d", rowsDeleted, len(deleteScopes))) } msgs = append(msgs, deleteScopesOplogMsgs...) } if len(addScopes) > 0 { addScopesOplogMsgs := make([]*oplog.Message, 0, len(addScopes)) if err := w.CreateItems(ctx, addScopes, db.NewOplogMsgs(&addScopesOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add claims scopes")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add claims scopes")) } msgs = append(msgs, addScopesOplogMsgs...) } @@ -367,24 +367,24 @@ func (r *Repository) UpdateAuthMethod(ctx context.Context, am *AuthMethod, versi deleteMapsOplogMsgs := make([]*oplog.Message, 0, len(deleteMaps)) rowsDeleted, err := w.DeleteItems(ctx, deleteMaps, db.NewOplogMsgs(&deleteMapsOplogMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete account claim maps")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete account claim maps")) } if rowsDeleted != len(deleteMaps) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("account claim maps deleted %d did not match request for %d", rowsDeleted, len(deleteMaps))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("account claim maps deleted %d did not match request for %d", rowsDeleted, len(deleteMaps))) } msgs = append(msgs, deleteMapsOplogMsgs...) } if len(addMaps) > 0 { addMapsOplogMsgs := make([]*oplog.Message, 0, len(addMaps)) if err := w.CreateItems(ctx, addMaps, db.NewOplogMsgs(&addMapsOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add account claim maps")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add account claim maps")) } msgs = append(msgs, addMapsOplogMsgs...) } metadata := updatedAm.oplog(oplog.OpType_OP_TYPE_UPDATE) if err := w.WriteOplogEntryWith(ctx, oplogWrapper, ticket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } // we need a new repo, that's using the same reader/writer as this TxHandler txRepo := &Repository{ @@ -396,16 +396,16 @@ func (r *Repository) UpdateAuthMethod(ctx context.Context, am *AuthMethod, versi } updatedAm, err = txRepo.lookupAuthMethod(ctx, updatedAm.PublicId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to lookup auth method after update")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to lookup auth method after update")) } if updatedAm == nil { - return errors.New(errors.RecordNotFound, op, "unable to lookup auth method after update") + return errors.New(ctx, errors.RecordNotFound, op, "unable to lookup auth method after update") } return nil }, ) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } providerCache().delete(ctx, updatedAm.PublicId) @@ -435,44 +435,44 @@ func validVoName(name voName) bool { } // factoryFunc defines a func type for value object factories -type factoryFunc func(publicId string, i interface{}) (interface{}, error) +type factoryFunc func(ctx context.Context, publicId string, i interface{}) (interface{}, error) // supportedFactories are the currently supported factoryFunc for value objects var supportedFactories = map[voName]factoryFunc{ - SigningAlgVO: func(publicId string, i interface{}) (interface{}, error) { + SigningAlgVO: func(ctx context.Context, publicId string, i interface{}) (interface{}, error) { str := fmt.Sprintf("%s", i) - return NewSigningAlg(publicId, Alg(str)) + return NewSigningAlg(ctx, publicId, Alg(str)) }, - CertificateVO: func(publicId string, i interface{}) (interface{}, error) { + CertificateVO: func(ctx context.Context, publicId string, i interface{}) (interface{}, error) { str := fmt.Sprintf("%s", i) - return NewCertificate(publicId, str) + return NewCertificate(ctx, publicId, str) }, - AudClaimVO: func(publicId string, i interface{}) (interface{}, error) { + AudClaimVO: func(ctx context.Context, publicId string, i interface{}) (interface{}, error) { str := fmt.Sprintf("%s", i) - return NewAudClaim(publicId, str) + return NewAudClaim(ctx, publicId, str) }, - ClaimsScopesVO: func(publicId string, i interface{}) (interface{}, error) { + ClaimsScopesVO: func(ctx context.Context, publicId string, i interface{}) (interface{}, error) { str := fmt.Sprintf("%s", i) - return NewClaimsScope(publicId, str) + return NewClaimsScope(ctx, publicId, str) }, - AccountClaimMapsVO: func(publicId string, i interface{}) (interface{}, error) { + AccountClaimMapsVO: func(ctx context.Context, publicId string, i interface{}) (interface{}, error) { const op = "oidc.AccountClaimMapsFactory" str := fmt.Sprintf("%s", i) - acm, err := ParseAccountClaimMaps(str) + acm, err := ParseAccountClaimMaps(ctx, str) if err != nil { return nil, err } if len(acm) > 1 { - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("unable to parse account claim map %s", str)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("unable to parse account claim map %s", str)) } var m ClaimMap for _, m = range acm { } - to, err := ConvertToAccountToClaim(m.To) + to, err := ConvertToAccountToClaim(ctx, m.To) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } - return NewAccountClaimMap(publicId, m.From, to) + return NewAccountClaimMap(ctx, publicId, m.From, to) }, } @@ -480,6 +480,7 @@ var supportedFactories = map[voName]factoryFunc{ // using the dbMasks/nullFields it will return lists of VOs where need to be // added and deleted in order to reconcile auth method's value objects. func valueObjectChanges( + ctx context.Context, publicId string, valueObjectName voName, newVOs, @@ -489,24 +490,24 @@ func valueObjectChanges( ) (add []interface{}, del []interface{}, e error) { const op = "valueObjectChanges" if publicId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing public id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } if !validVoName(valueObjectName) { - return nil, nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("invalid value object name: %s", valueObjectName)) + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("invalid value object name: %s", valueObjectName)) } if !strutil.StrListContains(dbMask, string(valueObjectName)) && !strutil.StrListContains(nullFields, string(valueObjectName)) { return nil, nil, nil } if len(strutil.RemoveDuplicates(newVOs, false)) != len(newVOs) { - return nil, nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("duplicate new %s", valueObjectName)) + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("duplicate new %s", valueObjectName)) } if len(strutil.RemoveDuplicates(oldVOs, false)) != len(oldVOs) { - return nil, nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("duplicate old %s", valueObjectName)) + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("duplicate old %s", valueObjectName)) } factory, ok := supportedFactories[valueObjectName] if !ok { - return nil, nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("unsupported factory for value object: %s", valueObjectName)) + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("unsupported factory for value object: %s", valueObjectName)) } if len(dbMask) == 0 && len(nullFields) == 0 { @@ -522,9 +523,9 @@ func valueObjectChanges( if strutil.StrListContains(nullFields, string(valueObjectName)) { deletes = make([]interface{}, 0, len(oldVOs)) for _, v := range oldVOs { - deleteObj, err := factory(publicId, v) + deleteObj, err := factory(ctx, publicId, v) if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } deletes = append(deletes, deleteObj) delete(foundVOs, v) @@ -537,9 +538,9 @@ func valueObjectChanges( delete(foundVOs, v) continue } - obj, err := factory(publicId, v) + obj, err := factory(ctx, publicId, v) if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } adds = append(adds, obj) delete(foundVOs, v) @@ -547,9 +548,9 @@ func valueObjectChanges( } if len(foundVOs) > 0 { for v := range foundVOs { - obj, err := factory(publicId, v) + obj, err := factory(ctx, publicId, v) if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } deletes = append(deletes, obj) delete(foundVOs, v) @@ -559,7 +560,7 @@ func valueObjectChanges( } // validateFieldMask check the field mask to ensure all the fields are updatable -func validateFieldMask(fieldMaskPaths []string) error { +func validateFieldMask(ctx context.Context, fieldMaskPaths []string) error { const op = "validateFieldMask" for _, f := range fieldMaskPaths { switch { @@ -576,7 +577,7 @@ func validateFieldMask(fieldMaskPaths []string) error { case strings.EqualFold(ClaimsScopesField, f): case strings.EqualFold(AccountClaimMapsField, f): default: - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("invalid field mask: %s", f)) + return errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("invalid field mask: %s", f)) } } return nil @@ -669,15 +670,15 @@ func (r *Repository) ValidateDiscoveryInfo(ctx context.Context, opt ...Option) e var err error am, err = r.lookupAuthMethod(ctx, opts.withPublicId) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if am == nil { - return errors.New(errors.RecordNotFound, op, fmt.Sprintf("unable to lookup auth method %s", opts.withPublicId)) + return errors.New(ctx, errors.RecordNotFound, op, fmt.Sprintf("unable to lookup auth method %s", opts.withPublicId)) } case opts.withAuthMethod != nil: am = opts.withAuthMethod default: - return errors.New(errors.InvalidParameter, op, "neither WithPublicId(...) nor WithAuthMethod(...) options were provided") + return errors.New(ctx, errors.InvalidParameter, op, "neither WithPublicId(...) nor WithAuthMethod(...) options were provided") } // FYI: once converted to an oidc.Provider, any certs configured will be used as trust anchors for all HTTP requests @@ -686,28 +687,28 @@ func (r *Repository) ValidateDiscoveryInfo(ctx context.Context, opt ...Option) e return nil } if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } info, err := provider.DiscoveryInfo(ctx) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } var result *multierror.Error if info.Issuer != am.Issuer { - result = multierror.Append(result, errors.New(errors.InvalidParameter, op, + result = multierror.Append(result, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("auth method issuer doesn't match discovery issuer: expected %s and got %s", am.Issuer, info.Issuer))) } for _, a := range am.SigningAlgs { if !strutil.StrListContains(info.IdTokenSigningAlgsSupported, a) { - result = multierror.Append(result, errors.New(errors.InvalidParameter, op, + result = multierror.Append(result, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("auth method signing alg is not in discovered supported algs: expected %s and got %s", a, info.IdTokenSigningAlgsSupported))) } } providerClient, err := provider.HTTPClient() if err != nil { - result = multierror.Append(result, errors.New(errors.Unknown, op, "unable to get oidc http client", errors.WithWrap(err))) + result = multierror.Append(result, errors.New(ctx, errors.Unknown, op, "unable to get oidc http client", errors.WithWrap(err))) return result.ErrorOrNil() } @@ -720,20 +721,20 @@ func (r *Repository) ValidateDiscoveryInfo(ctx context.Context, opt ...Option) e // test JWKs URL statusCode, err := pingEndpoint(ctx, providerClient, "JWKs", "GET", info.JWKSURL) if err != nil { - result = multierror.Append(result, errors.New(errors.Unknown, op, fmt.Sprintf("unable to verify JWKs endpoint: %s", info.JWKSURL), errors.WithWrap(err))) + result = multierror.Append(result, errors.New(ctx, errors.Unknown, op, fmt.Sprintf("unable to verify JWKs endpoint: %s", info.JWKSURL), errors.WithWrap(err))) } if statusCode != 200 { - result = multierror.Append(result, errors.New(errors.Unknown, op, fmt.Sprintf("non-200 status (%d) from JWKs endpoint: %s", statusCode, info.JWKSURL), errors.WithWrap(err))) + result = multierror.Append(result, errors.New(ctx, errors.Unknown, op, fmt.Sprintf("non-200 status (%d) from JWKs endpoint: %s", statusCode, info.JWKSURL), errors.WithWrap(err))) } // test Auth URL if _, err := pingEndpoint(ctx, providerClient, "AuthURL", "GET", info.AuthURL); err != nil { - result = multierror.Append(result, errors.New(errors.Unknown, op, fmt.Sprintf("unable to verify authorize endpoint: %s", info.AuthURL), errors.WithWrap(err))) + result = multierror.Append(result, errors.New(ctx, errors.Unknown, op, fmt.Sprintf("unable to verify authorize endpoint: %s", info.AuthURL), errors.WithWrap(err))) } // test Token URL if _, err := pingEndpoint(ctx, providerClient, "TokenURL", "POST", info.TokenURL); err != nil { - result = multierror.Append(result, errors.New(errors.Unknown, op, fmt.Sprintf("unable to verify token endpoint: %s", info.TokenURL), errors.WithWrap(err))) + result = multierror.Append(result, errors.New(ctx, errors.Unknown, op, fmt.Sprintf("unable to verify token endpoint: %s", info.TokenURL), errors.WithWrap(err))) } // we're not verifying the UserInfo URL, since it's not a required dependency. @@ -750,11 +751,11 @@ func pingEndpoint(ctx context.Context, client HTTPClient, endpointType, method, const op = "oidc.pingEndpoint" req, err := http.NewRequestWithContext(ctx, method, url, nil) if err != nil { - return 0, errors.New(errors.Unknown, op, fmt.Sprintf("unable to create %s http request", endpointType), errors.WithWrap(err)) + return 0, errors.New(ctx, errors.Unknown, op, fmt.Sprintf("unable to create %s http request", endpointType), errors.WithWrap(err)) } resp, err := client.Do(req) if err != nil { - return 0, errors.New(errors.Unknown, op, fmt.Sprintf("request to %s endpoint failed", endpointType), errors.WithWrap(err)) + return 0, errors.New(ctx, errors.Unknown, op, fmt.Sprintf("request to %s endpoint failed", endpointType), errors.WithWrap(err)) } return resp.StatusCode, nil } diff --git a/internal/auth/oidc/repository_auth_method_update_test.go b/internal/auth/oidc/repository_auth_method_update_test.go index 7801c8c05..e3f8601a6 100644 --- a/internal/auth/oidc/repository_auth_method_update_test.go +++ b/internal/auth/oidc/repository_auth_method_update_test.go @@ -35,12 +35,12 @@ func Test_UpdateAuthMethod(t *testing.T) { tpClientSecret := "her-dog's-name" tp.SetClientCreds(tpClientId, tpClientSecret) _, _, tpAlg, _ := tp.SigningKeys() - tpCert, err := ParseCertificates(tp.CACert()) + tpCert, err := ParseCertificates(ctx, tp.CACert()) require.NoError(t, err) require.Equal(t, 1, len(tpCert)) rw := db.New(conn) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) require.NoError(t, err) tests := []struct { @@ -428,7 +428,7 @@ func Test_UpdateAuthMethod(t *testing.T) { setup: func() *AuthMethod { return nil }, updateWith: func(orig *AuthMethod) *AuthMethod { a := AllocAuthMethod() - id, _ := newAuthMethodId() + id, _ := newAuthMethodId(ctx) a.PublicId = id return &a }, @@ -441,7 +441,7 @@ func Test_UpdateAuthMethod(t *testing.T) { setup: func() *AuthMethod { return nil }, updateWith: func(orig *AuthMethod) *AuthMethod { a := AllocAuthMethod() - id, _ := newAuthMethodId() + id, _ := newAuthMethodId(ctx) a.PublicId = id return &a }, @@ -453,7 +453,7 @@ func Test_UpdateAuthMethod(t *testing.T) { setup: func() *AuthMethod { return nil }, updateWith: func(orig *AuthMethod) *AuthMethod { a := AllocAuthMethod() - id, _ := newAuthMethodId() + id, _ := newAuthMethodId(ctx) a.PublicId = id return &a }, @@ -601,12 +601,12 @@ func Test_DisableDiscoveredConfigValidation(t *testing.T) { tpClientSecret := "her-dog's-name" tp.SetClientCreds(tpClientId, tpClientSecret) _, _, tpAlg, _ := tp.SigningKeys() - tpCert, err := ParseCertificates(tp.CACert()) + tpCert, err := ParseCertificates(ctx, tp.CACert()) require.NoError(err) require.Equal(1, len(tpCert)) rw := db.New(conn) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) require.NoError(err) org, _ := iam.TestScopes(t, iam.TestRepo(t, conn, wrapper)) databaseWrapper, err := kmsCache.GetWrapper(context.Background(), org.PublicId, kms.KeyPurposeDatabase) @@ -661,7 +661,7 @@ func Test_ValidateDiscoveryInfo(t *testing.T) { tpClientSecret := "her-dog's-name" tp.SetClientCreds(tpClientId, tpClientSecret) _, _, tpAlg, _ := tp.SigningKeys() - tpCert, err := ParseCertificates(tp.CACert()) + tpCert, err := ParseCertificates(ctx, tp.CACert()) require.NoError(t, err) require.Equal(t, 1, len(tpCert)) @@ -670,7 +670,7 @@ func Test_ValidateDiscoveryInfo(t *testing.T) { kmsCache := kms.TestKms(t, conn, wrapper) org, _ := iam.TestScopes(t, iam.TestRepo(t, conn, wrapper)) rw := db.New(conn) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) require.NoError(t, err) databaseWrapper, err := kmsCache.GetWrapper(context.Background(), org.PublicId, kms.KeyPurposeDatabase) @@ -772,6 +772,7 @@ func Test_ValidateDiscoveryInfo(t *testing.T) { func Test_valueObjectChanges(t *testing.T) { t.Parallel() + ctx := context.TODO() _, pem1 := testGenerateCA(t, "localhost") _, pem2 := testGenerateCA(t, "127.0.0.1") _, pem3 := testGenerateCA(t, "www.example.com") @@ -795,18 +796,18 @@ func Test_valueObjectChanges(t *testing.T) { old: []string{"RS256", "RS384", "RS512"}, dbMask: []string{string(SigningAlgVO)}, wantAdd: func() []interface{} { - a, err := NewSigningAlg("am-public-id", ES256) + a, err := NewSigningAlg(ctx, "am-public-id", ES256) require.NoError(t, err) - a2, err := NewSigningAlg("am-public-id", ES384) + a2, err := NewSigningAlg(ctx, "am-public-id", ES384) require.NoError(t, err) return []interface{}{a, a2} }(), wantDel: func() []interface{} { - a, err := NewSigningAlg("am-public-id", RS256) + a, err := NewSigningAlg(ctx, "am-public-id", RS256) require.NoError(t, err) - a2, err := NewSigningAlg("am-public-id", RS384) + a2, err := NewSigningAlg(ctx, "am-public-id", RS384) require.NoError(t, err) - a3, err := NewSigningAlg("am-public-id", RS512) + a3, err := NewSigningAlg(ctx, "am-public-id", RS512) require.NoError(t, err) return []interface{}{a, a2, a3} }(), @@ -819,14 +820,14 @@ func Test_valueObjectChanges(t *testing.T) { old: []string{pem3}, dbMask: []string{string(CertificateVO)}, wantAdd: func() []interface{} { - c, err := NewCertificate("am-public-id", pem1) + c, err := NewCertificate(ctx, "am-public-id", pem1) require.NoError(t, err) - c2, err := NewCertificate("am-public-id", pem2) + c2, err := NewCertificate(ctx, "am-public-id", pem2) require.NoError(t, err) return []interface{}{c, c2} }(), wantDel: func() []interface{} { - c, err := NewCertificate("am-public-id", pem3) + c, err := NewCertificate(ctx, "am-public-id", pem3) require.NoError(t, err) return []interface{}{c} }(), @@ -839,18 +840,18 @@ func Test_valueObjectChanges(t *testing.T) { old: []string{"old-aud1", "old-aud2", "old-aud3"}, dbMask: []string{string(AudClaimVO)}, wantAdd: func() []interface{} { - a, err := NewAudClaim("am-public-id", "new-aud1") + a, err := NewAudClaim(ctx, "am-public-id", "new-aud1") require.NoError(t, err) - a2, err := NewAudClaim("am-public-id", "new-aud2") + a2, err := NewAudClaim(ctx, "am-public-id", "new-aud2") require.NoError(t, err) return []interface{}{a, a2} }(), wantDel: func() []interface{} { - a, err := NewAudClaim("am-public-id", "old-aud1") + a, err := NewAudClaim(ctx, "am-public-id", "old-aud1") require.NoError(t, err) - a2, err := NewAudClaim("am-public-id", "old-aud2") + a2, err := NewAudClaim(ctx, "am-public-id", "old-aud2") require.NoError(t, err) - a3, err := NewAudClaim("am-public-id", "old-aud3") + a3, err := NewAudClaim(ctx, "am-public-id", "old-aud3") require.NoError(t, err) return []interface{}{a, a2, a3} }(), @@ -864,11 +865,11 @@ func Test_valueObjectChanges(t *testing.T) { old: []string{"old-aud1", "old-aud2", "old-aud3"}, nullFields: []string{string(AudClaimVO)}, wantDel: func() []interface{} { - a, err := NewAudClaim("am-public-id", "old-aud1") + a, err := NewAudClaim(ctx, "am-public-id", "old-aud1") require.NoError(t, err) - a2, err := NewAudClaim("am-public-id", "old-aud2") + a2, err := NewAudClaim(ctx, "am-public-id", "old-aud2") require.NoError(t, err) - a3, err := NewAudClaim("am-public-id", "old-aud3") + a3, err := NewAudClaim(ctx, "am-public-id", "old-aud3") require.NoError(t, err) return []interface{}{a, a2, a3} }(), @@ -881,18 +882,18 @@ func Test_valueObjectChanges(t *testing.T) { old: []string{"old-scope1", "old-scope2", "old-scope3"}, dbMask: []string{string(ClaimsScopesVO)}, wantAdd: func() []interface{} { - cs, err := NewClaimsScope("am-public-id", "new-scope1") + cs, err := NewClaimsScope(ctx, "am-public-id", "new-scope1") require.NoError(t, err) - cs2, err := NewClaimsScope("am-public-id", "new-scope2") + cs2, err := NewClaimsScope(ctx, "am-public-id", "new-scope2") require.NoError(t, err) return []interface{}{cs, cs2} }(), wantDel: func() []interface{} { - cs, err := NewClaimsScope("am-public-id", "old-scope1") + cs, err := NewClaimsScope(ctx, "am-public-id", "old-scope1") require.NoError(t, err) - cs2, err := NewClaimsScope("am-public-id", "old-scope2") + cs2, err := NewClaimsScope(ctx, "am-public-id", "old-scope2") require.NoError(t, err) - cs3, err := NewClaimsScope("am-public-id", "old-scope3") + cs3, err := NewClaimsScope(ctx, "am-public-id", "old-scope3") require.NoError(t, err) return []interface{}{cs, cs2, cs3} }(), @@ -905,11 +906,11 @@ func Test_valueObjectChanges(t *testing.T) { old: []string{"old-scope1", "old-scope2", "old-scope3"}, nullFields: []string{string(ClaimsScopesVO)}, wantDel: func() []interface{} { - cs, err := NewClaimsScope("am-public-id", "old-scope1") + cs, err := NewClaimsScope(ctx, "am-public-id", "old-scope1") require.NoError(t, err) - cs2, err := NewClaimsScope("am-public-id", "old-scope2") + cs2, err := NewClaimsScope(ctx, "am-public-id", "old-scope2") require.NoError(t, err) - cs3, err := NewClaimsScope("am-public-id", "old-scope3") + cs3, err := NewClaimsScope(ctx, "am-public-id", "old-scope3") require.NoError(t, err) return []interface{}{cs, cs2, cs3} }(), @@ -921,11 +922,11 @@ func Test_valueObjectChanges(t *testing.T) { old: []string{"old-aud1", "old-aud2", "old-aud3"}, nullFields: []string{string(AudClaimVO)}, wantDel: func() []interface{} { - a, err := NewAudClaim("am-public-id", "old-aud1") + a, err := NewAudClaim(ctx, "am-public-id", "old-aud1") require.NoError(t, err) - a2, err := NewAudClaim("am-public-id", "old-aud2") + a2, err := NewAudClaim(ctx, "am-public-id", "old-aud2") require.NoError(t, err) - a3, err := NewAudClaim("am-public-id", "old-aud3") + a3, err := NewAudClaim(ctx, "am-public-id", "old-aud3") require.NoError(t, err) return []interface{}{a, a2, a3} }(), @@ -939,11 +940,11 @@ func Test_valueObjectChanges(t *testing.T) { old: []string{"old-aud1", "old-aud2", "old-aud3"}, nullFields: []string{string(AudClaimVO)}, wantDel: func() []interface{} { - a, err := NewAudClaim("am-public-id", "old-aud1") + a, err := NewAudClaim(ctx, "am-public-id", "old-aud1") require.NoError(t, err) - a2, err := NewAudClaim("am-public-id", "old-aud2") + a2, err := NewAudClaim(ctx, "am-public-id", "old-aud2") require.NoError(t, err) - a3, err := NewAudClaim("am-public-id", "old-aud3") + a3, err := NewAudClaim(ctx, "am-public-id", "old-aud3") require.NoError(t, err) return []interface{}{a, a2, a3} }(), @@ -957,18 +958,18 @@ func Test_valueObjectChanges(t *testing.T) { old: []string{"RS256", "RS384", "RS512"}, dbMask: []string{string(SigningAlgVO)}, wantAdd: func() []interface{} { - a, err := NewSigningAlg("am-public-id", ES256) + a, err := NewSigningAlg(ctx, "am-public-id", ES256) require.NoError(t, err) - a2, err := NewSigningAlg("am-public-id", ES384) + a2, err := NewSigningAlg(ctx, "am-public-id", ES384) require.NoError(t, err) return []interface{}{a, a2} }(), wantDel: func() []interface{} { - a, err := NewSigningAlg("am-public-id", RS256) + a, err := NewSigningAlg(ctx, "am-public-id", RS256) require.NoError(t, err) - a2, err := NewSigningAlg("am-public-id", RS384) + a2, err := NewSigningAlg(ctx, "am-public-id", RS384) require.NoError(t, err) - a3, err := NewSigningAlg("am-public-id", RS512) + a3, err := NewSigningAlg(ctx, "am-public-id", RS512) require.NoError(t, err) return []interface{}{a, a2, a3} }(), @@ -982,18 +983,18 @@ func Test_valueObjectChanges(t *testing.T) { old: []string{"RS256", "RS256", "RS512"}, dbMask: []string{string(SigningAlgVO)}, wantAdd: func() []interface{} { - a, err := NewSigningAlg("am-public-id", ES256) + a, err := NewSigningAlg(ctx, "am-public-id", ES256) require.NoError(t, err) - a2, err := NewSigningAlg("am-public-id", ES384) + a2, err := NewSigningAlg(ctx, "am-public-id", ES384) require.NoError(t, err) return []interface{}{a, a2} }(), wantDel: func() []interface{} { - a, err := NewSigningAlg("am-public-id", RS256) + a, err := NewSigningAlg(ctx, "am-public-id", RS256) require.NoError(t, err) - a2, err := NewSigningAlg("am-public-id", RS384) + a2, err := NewSigningAlg(ctx, "am-public-id", RS384) require.NoError(t, err) - a3, err := NewSigningAlg("am-public-id", RS512) + a3, err := NewSigningAlg(ctx, "am-public-id", RS512) require.NoError(t, err) return []interface{}{a, a2, a3} }(), @@ -1003,7 +1004,7 @@ func Test_valueObjectChanges(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - gotAdd, gotDel, err := valueObjectChanges(tt.id, tt.voName, tt.new, tt.old, tt.dbMask, tt.nullFields) + gotAdd, gotDel, err := valueObjectChanges(context.TODO(), tt.id, tt.voName, tt.new, tt.old, tt.dbMask, tt.nullFields) if tt.wantErrMatch != nil { require.Error(err) assert.Truef(errors.Match(tt.wantErrMatch, err), "want err code: %q got: %q", tt.wantErrMatch.Code, err) @@ -1075,7 +1076,7 @@ func Test_validateFieldMask(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { require := require.New(t) - err := validateFieldMask(tt.fieldMask) + err := validateFieldMask(context.TODO(), tt.fieldMask) if tt.wantErr { require.Error(err) return diff --git a/internal/auth/oidc/repository_managed_group.go b/internal/auth/oidc/repository_managed_group.go index e5193586d..606b5ed0c 100644 --- a/internal/auth/oidc/repository_managed_group.go +++ b/internal/auth/oidc/repository_managed_group.go @@ -22,35 +22,35 @@ import ( func (r *Repository) CreateManagedGroup(ctx context.Context, scopeId string, mg *ManagedGroup, opt ...Option) (*ManagedGroup, error) { const op = "oidc.(Repository).CreateManagedGroup" if mg == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing ManagedGroup") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing ManagedGroup") } if mg.ManagedGroup == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing embedded ManagedGroup") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing embedded ManagedGroup") } if mg.AuthMethodId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing auth method id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing auth method id") } if mg.Filter == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing filter") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing filter") } if mg.PublicId != "" { - return nil, errors.New(errors.InvalidParameter, op, "public id must be empty") + return nil, errors.New(ctx, errors.InvalidParameter, op, "public id must be empty") } if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } mg = mg.Clone() - id, err := newManagedGroupId() + id, err := newManagedGroupId(ctx) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } mg.PublicId = id oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper"), errors.WithCode(errors.Encrypt)) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper"), errors.WithCode(errors.Encrypt)) } var newManagedGroup *ManagedGroup @@ -58,7 +58,7 @@ func (r *Repository) CreateManagedGroup(ctx context.Context, scopeId string, mg func(_ db.Reader, w db.Writer) error { newManagedGroup = mg.Clone() if err := w.Create(ctx, newManagedGroup, db.WithOplog(oplogWrapper, mg.oplog(oplog.OpType_OP_TYPE_CREATE, scopeId))); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, @@ -66,11 +66,11 @@ func (r *Repository) CreateManagedGroup(ctx context.Context, scopeId string, mg if err != nil { if errors.IsUniqueError(err) { - return nil, errors.New(errors.NotUnique, op, fmt.Sprintf( + return nil, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf( "in auth method %s: name %q already exists", mg.AuthMethodId, mg.Name)) } - return nil, errors.Wrap(err, op, errors.WithMsg(mg.AuthMethodId)) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(mg.AuthMethodId)) } return newManagedGroup, nil } @@ -80,7 +80,7 @@ func (r *Repository) CreateManagedGroup(ctx context.Context, scopeId string, mg func (r *Repository) LookupManagedGroup(ctx context.Context, withPublicId string, opt ...Option) (*ManagedGroup, error) { const op = "oidc.(Repository).LookupManagedGroup" if withPublicId == "" { - return nil, errors.New(errors.InvalidPublicId, op, "missing public id") + return nil, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } a := AllocManagedGroup() a.PublicId = withPublicId @@ -88,7 +88,7 @@ func (r *Repository) LookupManagedGroup(ctx context.Context, withPublicId string if errors.IsNotFoundError(err) { return nil, nil } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", withPublicId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", withPublicId))) } return a, nil } @@ -97,7 +97,7 @@ func (r *Repository) LookupManagedGroup(ctx context.Context, withPublicId string func (r *Repository) ListManagedGroups(ctx context.Context, withAuthMethodId string, opt ...Option) ([]*ManagedGroup, error) { const op = "oidc.(Repository).ListManagedGroups" if withAuthMethodId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing auth method id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing auth method id") } opts := getOpts(opt...) limit := r.defaultLimit @@ -108,7 +108,7 @@ func (r *Repository) ListManagedGroups(ctx context.Context, withAuthMethodId str var mgs []*ManagedGroup err := r.reader.SearchWhere(ctx, &mgs, "auth_method_id = ?", []interface{}{withAuthMethodId}, db.WithLimit(limit)) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return mgs, nil } @@ -119,17 +119,17 @@ func (r *Repository) ListManagedGroups(ctx context.Context, withAuthMethodId str func (r *Repository) DeleteManagedGroup(ctx context.Context, scopeId, withPublicId string, opt ...Option) (int, error) { const op = "oidc.(Repository).DeleteManagedGroup" if withPublicId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidPublicId, op, "missing public id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } if scopeId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing scope id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } mg := AllocManagedGroup() mg.PublicId = withPublicId oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get oplog wrapper")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get oplog wrapper")) } var rowsDeleted int @@ -142,17 +142,17 @@ func (r *Repository) DeleteManagedGroup(ctx context.Context, scopeId, withPublic dMg := mg.Clone() rowsDeleted, err = w.Delete(ctx, dMg, db.WithOplog(oplogWrapper, metadata)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(withPublicId)) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(withPublicId)) } return rowsDeleted, nil @@ -172,19 +172,19 @@ func (r *Repository) DeleteManagedGroup(ctx context.Context, scopeId, withPublic func (r *Repository) UpdateManagedGroup(ctx context.Context, scopeId string, mg *ManagedGroup, version uint32, fieldMaskPaths []string, opt ...Option) (*ManagedGroup, int, error) { const op = "oidc.(Repository).UpdateManagedGroup" if mg == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing ManagedGroup") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing ManagedGroup") } if mg.ManagedGroup == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing embedded ManagedGroup") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing embedded ManagedGroup") } if mg.PublicId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidPublicId, op, "missing public id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } if version == 0 { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing version") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing version") } if scopeId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } for _, f := range fieldMaskPaths { @@ -193,7 +193,7 @@ func (r *Repository) UpdateManagedGroup(ctx context.Context, scopeId string, mg case strings.EqualFold(DescriptionField, f): case strings.EqualFold(FilterField, f): default: - return nil, db.NoRowsAffected, errors.New(errors.InvalidFieldMask, op, f) + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidFieldMask, op, f) } } var dbMask, nullFields []string @@ -207,12 +207,12 @@ func (r *Repository) UpdateManagedGroup(ctx context.Context, scopeId string, mg nil, ) if len(dbMask) == 0 && len(nullFields) == 0 { - return nil, db.NoRowsAffected, errors.New(errors.EmptyFieldMask, op, "missing field mask") + return nil, db.NoRowsAffected, errors.New(ctx, errors.EmptyFieldMask, op, "missing field mask") } oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg(("unable to get oplog wrapper"))) } @@ -230,10 +230,10 @@ func (r *Repository) UpdateManagedGroup(ctx context.Context, scopeId string, mg var err error rowsUpdated, err = w.Update(ctx, returnedManagedGroup, dbMask, nullFields, db.WithOplog(oplogWrapper, metadata), db.WithVersion(&version)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsUpdated > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been updated") } return nil }, @@ -241,10 +241,10 @@ func (r *Repository) UpdateManagedGroup(ctx context.Context, scopeId string, mg if err != nil { if errors.IsUniqueError(err) { - return nil, db.NoRowsAffected, errors.New(errors.NotUnique, op, + return nil, db.NoRowsAffected, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("name %s already exists: %s", mg.Name, mg.PublicId)) } - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(mg.PublicId)) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(mg.PublicId)) } return returnedManagedGroup, rowsUpdated, nil diff --git a/internal/auth/oidc/repository_managed_group_members.go b/internal/auth/oidc/repository_managed_group_members.go index b2b9fc8e2..2758aaf36 100644 --- a/internal/auth/oidc/repository_managed_group_members.go +++ b/internal/auth/oidc/repository_managed_group_members.go @@ -21,37 +21,37 @@ import ( func (r *Repository) SetManagedGroupMemberships(ctx context.Context, am *AuthMethod, acct *Account, mgs []*ManagedGroup, _ ...Option) ([]*ManagedGroupMemberAccount, int, error) { const op = "oidc.(Repository).SetManagedGroupMemberships" if am == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing auth method") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing auth method") } if am.AuthMethod == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing auth method store") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing auth method store") } if am.PublicId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing auth method id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing auth method id") } if am.ScopeId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing auth method scope id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing auth method scope id") } if acct == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing account") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing account") } if acct.Account == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing account store") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing account store") } if acct.PublicId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing account id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing account id") } oplogWrapper, err := r.kms.GetWrapper(ctx, am.ScopeId, kms.KeyPurposeOplog) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } newMgPublicIds := make(map[string]bool, len(mgs)) mgsToUpdate := make([]*ManagedGroup, 0, len(mgs)) for _, mg := range mgs { if mg.Version == 0 { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, fmt.Sprintf("missing version for managed group %s", mg.PublicId)) + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("missing version for managed group %s", mg.PublicId)) } if newMgPublicIds[mg.PublicId] { // We've already seen this -- could be a duplicate in the incoming @@ -80,7 +80,7 @@ func (r *Repository) SetManagedGroupMemberships(ctx context.Context, am *AuthMet // we need to write oplog entries for deletes and adds. mgTicket, err := w.GetTicket(ticketMg) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket for oidc managed groups")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket for oidc managed groups")) } msgs := make([]*oplog.Message, 0, len(mgs)+5) @@ -100,17 +100,17 @@ func (r *Repository) SetManagedGroupMemberships(ctx context.Context, am *AuthMet prevVersion := mgToUpdate.Version - 1 rowsUpdated, err := w.Update(ctx, mgToUpdate, []string{"Version"}, nil, db.NewOplogMsg(&mgOplogMsg), db.WithVersion(&prevVersion)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated oidc managed group and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated oidc managed group and %d rows updated", rowsUpdated)) } msgs = append(msgs, &mgOplogMsg) } currentMemberships, err = r.ListManagedGroupMembershipsByMember(ctx, acct.PublicId, WithReader(reader)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current managed group memberships before deletion")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current managed group memberships before deletion")) } // Figure out which ones to delete and which ones we already have @@ -136,7 +136,7 @@ func (r *Repository) SetManagedGroupMemberships(ctx context.Context, am *AuthMet // also none to delete, we return at this point. Nothing will have // changed and nothing will be changed either. if len(mgs) == 0 && len(toDelete) == 0 { - return errors.New(errors.GracefullyAborted, op, "nothing to do") + return errors.New(ctx, errors.GracefullyAborted, op, "nothing to do") } // Start with deletion @@ -145,10 +145,10 @@ func (r *Repository) SetManagedGroupMemberships(ctx context.Context, am *AuthMet deleteOplogMsgs := make([]*oplog.Message, 0, len(toDelete)) rowsDeleted, err := w.DeleteItems(ctx, toDelete, db.NewOplogMsgs(&deleteOplogMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete managed group member accounts")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete managed group member accounts")) } if rowsDeleted != len(toDelete) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("managed group member accounts deleted %d did not match request for %d", rowsDeleted, len(toDelete))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("managed group member accounts deleted %d did not match request for %d", rowsDeleted, len(toDelete))) } totalRowsAffected += rowsDeleted msgs = append(msgs, deleteOplogMsgs...) @@ -166,7 +166,7 @@ func (r *Repository) SetManagedGroupMemberships(ctx context.Context, am *AuthMet toAdd = append(toAdd, newMg) } if err := w.CreateItems(ctx, toAdd, db.NewOplogMsgs(&addOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add managed group member accounts")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add managed group member accounts")) } totalRowsAffected += len(toAdd) msgs = append(msgs, addOplogMsgs...) @@ -174,18 +174,18 @@ func (r *Repository) SetManagedGroupMemberships(ctx context.Context, am *AuthMet if len(msgs) > 0 { if err := w.WriteOplogEntryWith(ctx, oplogWrapper, mgTicket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } } currentMemberships, err = r.ListManagedGroupMembershipsByMember(ctx, acct.PublicId, WithReader(reader)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current managed group memberships after set")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current managed group memberships after set")) } return nil }) if err != nil && !errors.Match(errors.T(errors.GracefullyAborted), err) { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } return currentMemberships, totalRowsAffected, nil } @@ -195,7 +195,7 @@ func (r *Repository) SetManagedGroupMemberships(ctx context.Context, am *AuthMet func (r *Repository) ListManagedGroupMembershipsByMember(ctx context.Context, withAcctId string, opt ...Option) ([]*ManagedGroupMemberAccount, error) { const op = "oidc.(Repository).ListManagedGroupMembershipsByMember" if withAcctId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing account id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing account id") } opts := getOpts(opt...) limit := r.defaultLimit @@ -210,7 +210,7 @@ func (r *Repository) ListManagedGroupMembershipsByMember(ctx context.Context, wi var mgs []*ManagedGroupMemberAccount err := reader.SearchWhere(ctx, &mgs, "member_id = ?", []interface{}{withAcctId}, db.WithLimit(limit)) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return mgs, nil } @@ -220,7 +220,7 @@ func (r *Repository) ListManagedGroupMembershipsByMember(ctx context.Context, wi func (r *Repository) ListManagedGroupMembershipsByGroup(ctx context.Context, withGroupId string, opt ...Option) ([]*ManagedGroupMemberAccount, error) { const op = "oidc.(Repository).ListManagedGroupMembershipsByGroup" if withGroupId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing managed group id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing managed group id") } opts := getOpts(opt...) limit := r.defaultLimit @@ -235,7 +235,7 @@ func (r *Repository) ListManagedGroupMembershipsByGroup(ctx context.Context, wit var mgs []*ManagedGroupMemberAccount err := reader.SearchWhere(ctx, &mgs, "managed_group_id = ?", []interface{}{withGroupId}, db.WithLimit(limit)) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return mgs, nil } diff --git a/internal/auth/oidc/repository_managed_group_members_test.go b/internal/auth/oidc/repository_managed_group_members_test.go index 863ebdbfe..429d9266e 100644 --- a/internal/auth/oidc/repository_managed_group_members_test.go +++ b/internal/auth/oidc/repository_managed_group_members_test.go @@ -51,7 +51,7 @@ func Test_ManagedGroupMemberships(t *testing.T) { oidc.WithApiUrl(oidc.TestConvertToUrls(t, "https://www.alice.com/callback")[0]), ) - repo, err := oidc.NewRepository(rw, rw, kmsCache) + repo, err := oidc.NewRepository(ctx, rw, rw, kmsCache) require.NoError(t, err) require.NotNil(t, repo) diff --git a/internal/auth/oidc/repository_managed_group_test.go b/internal/auth/oidc/repository_managed_group_test.go index abd99f97c..bf8d88a6b 100644 --- a/internal/auth/oidc/repository_managed_group_test.go +++ b/internal/auth/oidc/repository_managed_group_test.go @@ -182,7 +182,7 @@ func TestRepository_CreateManagedGroup(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) got, err := repo.CreateManagedGroup(context.Background(), tt.scopeId, tt.in, tt.opts...) @@ -232,7 +232,7 @@ func TestRepository_LookupManagedGroup(t *testing.T) { ) mg := TestManagedGroup(t, conn, authMethod, TestFakeManagedGroupFilter) - newMgId, err := newManagedGroupId() + newMgId, err := newManagedGroupId(ctx) require.NoError(t, err) tests := []struct { name string @@ -261,7 +261,7 @@ func TestRepository_LookupManagedGroup(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) got, err := repo.LookupManagedGroup(context.Background(), tt.in) @@ -296,7 +296,7 @@ func TestRepository_DeleteManagedGroup(t *testing.T) { WithApiUrl(TestConvertToUrls(t, "https://www.alice.com/callback")[0]), ) mg := TestManagedGroup(t, conn, authMethod, TestFakeManagedGroupFilter) - newMgId, err := newManagedGroupId() + newMgId, err := newManagedGroupId(ctx) require.NoError(t, err) tests := []struct { name string @@ -337,7 +337,7 @@ func TestRepository_DeleteManagedGroup(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) got, err := repo.DeleteManagedGroup(context.Background(), tt.scopeId, tt.in) @@ -437,7 +437,7 @@ func TestRepository_ListManagedGroups(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) got, err := repo.ListManagedGroups(context.Background(), tt.in, tt.opts...) @@ -531,7 +531,7 @@ func TestRepository_ListManagedGroups_Limits(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache, tt.repoOpts...) + repo, err := NewRepository(ctx, rw, rw, kmsCache, tt.repoOpts...) assert.NoError(err) require.NotNil(repo) got, err := repo.ListManagedGroups(context.Background(), am.GetPublicId(), tt.listOpts...) @@ -918,7 +918,7 @@ func TestRepository_UpdateManagedGroup(t *testing.T) { tt := tt t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) assert.NoError(err) require.NotNil(repo) diff --git a/internal/auth/oidc/repository_test.go b/internal/auth/oidc/repository_test.go index 99e95bd7c..3026d2059 100644 --- a/internal/auth/oidc/repository_test.go +++ b/internal/auth/oidc/repository_test.go @@ -1,6 +1,7 @@ package oidc import ( + "context" "testing" "github.com/hashicorp/boundary/internal/db" @@ -11,6 +12,7 @@ import ( ) func TestNewRepository(t *testing.T) { + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -101,7 +103,7 @@ func TestNewRepository(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - got, err := NewRepository(tt.args.r, tt.args.w, tt.args.kms, tt.args.opts...) + got, err := NewRepository(ctx, tt.args.r, tt.args.w, tt.args.kms, tt.args.opts...) if tt.wantErrMatch != nil { require.Error(err) assert.Truef(errors.Match(tt.wantErrMatch, err), "want err code: %q got: %q", tt.wantErrMatch, err) diff --git a/internal/auth/oidc/request/validate.go b/internal/auth/oidc/request/validate.go index 051b05a3c..8880b9644 100644 --- a/internal/auth/oidc/request/validate.go +++ b/internal/auth/oidc/request/validate.go @@ -1,66 +1,70 @@ package request -import "github.com/hashicorp/boundary/internal/errors" +import ( + "context" + + "github.com/hashicorp/boundary/internal/errors" +) // Validate the request.State -func (s *State) Validate() error { +func (s *State) Validate(ctx context.Context) error { const op = "request.(State).Validate" if s == nil { - return errors.New(errors.InvalidParameter, op, "missing state") + return errors.New(ctx, errors.InvalidParameter, op, "missing state") } if s.TokenRequestId == "" { - return errors.New(errors.InvalidParameter, op, "missing token request id") + return errors.New(ctx, errors.InvalidParameter, op, "missing token request id") } if s.CreateTime == nil { - return errors.New(errors.InvalidParameter, op, "missing create time") + return errors.New(ctx, errors.InvalidParameter, op, "missing create time") } if s.ExpirationTime == nil { - return errors.New(errors.InvalidParameter, op, "missing expiration time") + return errors.New(ctx, errors.InvalidParameter, op, "missing expiration time") } if s.FinalRedirectUrl == "" { - return errors.New(errors.InvalidParameter, op, "missing final redirect URL") + return errors.New(ctx, errors.InvalidParameter, op, "missing final redirect URL") } if s.Nonce == "" { - return errors.New(errors.InvalidParameter, op, "missing nonce") + return errors.New(ctx, errors.InvalidParameter, op, "missing nonce") } if s.ProviderConfigHash == 0 { - return errors.New(errors.InvalidParameter, op, "missing provider config hash") + return errors.New(ctx, errors.InvalidParameter, op, "missing provider config hash") } return nil } // Validate the request.Wrapper -func (w *Wrapper) Validate() error { +func (w *Wrapper) Validate(ctx context.Context) error { const op = "request.(Wrapper).Validate" if w == nil { - return errors.New(errors.InvalidParameter, op, "missing wrapper") + return errors.New(ctx, errors.InvalidParameter, op, "missing wrapper") } if w.AuthMethodId == "" { - return errors.New(errors.InvalidParameter, op, "missing auth method id") + return errors.New(ctx, errors.InvalidParameter, op, "missing auth method id") } if w.ScopeId == "" { - return errors.New(errors.InvalidParameter, op, "missing scope id") + return errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } if w.WrapperKeyId == "" { - return errors.New(errors.InvalidParameter, op, "missing wrapper key id") + return errors.New(ctx, errors.InvalidParameter, op, "missing wrapper key id") } if len(w.Ct) == 0 { - return errors.New(errors.InvalidParameter, op, "missing ct") + return errors.New(ctx, errors.InvalidParameter, op, "missing ct") } return nil } // Validate the request.Token -func (t *Token) Validate() error { +func (t *Token) Validate(ctx context.Context) error { const op = "request.(Token).Validate" if t == nil { - return errors.New(errors.InvalidParameter, op, "missing token") + return errors.New(ctx, errors.InvalidParameter, op, "missing token") } if t.RequestId == "" { - return errors.New(errors.InvalidParameter, op, "missing request id") + return errors.New(ctx, errors.InvalidParameter, op, "missing request id") } if t.ExpirationTime == nil { - return errors.New(errors.InvalidParameter, op, "missing expiration time") + return errors.New(ctx, errors.InvalidParameter, op, "missing expiration time") } return nil } diff --git a/internal/auth/oidc/service.go b/internal/auth/oidc/service.go index 37ee1b2a9..568668a62 100644 --- a/internal/auth/oidc/service.go +++ b/internal/auth/oidc/service.go @@ -59,46 +59,46 @@ type validator interface { func encryptMessage(ctx context.Context, wrapper wrapping.Wrapper, am *AuthMethod, m proto.Message) (encodedEncryptedState string, e error) { const op = "oidc.encryptMessage" if wrapper == nil { - return "", errors.New(errors.InvalidParameter, op, "missing wrapper") + return "", errors.New(ctx, errors.InvalidParameter, op, "missing wrapper") } if wrapper.KeyID() == "" { - return "", errors.New(errors.InvalidParameter, op, "missing wrapper key id") + return "", errors.New(ctx, errors.InvalidParameter, op, "missing wrapper key id") } if am == nil || am.AuthMethod == nil { - return "", errors.New(errors.InvalidParameter, op, "missing auth method") + return "", errors.New(ctx, errors.InvalidParameter, op, "missing auth method") } if am.ScopeId == "" { - return "", errors.New(errors.InvalidParameter, op, "missing auth method scope id") + return "", errors.New(ctx, errors.InvalidParameter, op, "missing auth method scope id") } if am.PublicId == "" { - return "", errors.New(errors.InvalidParameter, op, "missing auth method public id") + return "", errors.New(ctx, errors.InvalidParameter, op, "missing auth method public id") } if m == nil { - return "", errors.New(errors.InvalidParameter, op, "missing message to encrypt") + return "", errors.New(ctx, errors.InvalidParameter, op, "missing message to encrypt") } switch v := m.(type) { case *request.State, *request.Token: default: - return "", errors.New(errors.InvalidParameter, op, fmt.Sprintf("unsupported message type %v for encryption", v)) + return "", errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("unsupported message type %v for encryption", v)) } v, ok := m.(validator) if ok { if err := v.Validate(); err != nil { - return "", errors.Wrap(err, op) + return "", errors.Wrap(ctx, err, op) } } marshaled, err := proto.Marshal(m) if err != nil { - return "", errors.Wrap(err, op, errors.WithMsg("unable to marshal message"), errors.WithCode(errors.Encode)) + return "", errors.Wrap(ctx, err, op, errors.WithMsg("unable to marshal message"), errors.WithCode(errors.Encode)) } blobInfo, err := wrapper.Encrypt(ctx, marshaled, []byte(fmt.Sprintf("%s%s", am.PublicId, am.ScopeId))) if err != nil { - return "", errors.New(errors.Encrypt, op, "unable to encrypt message", errors.WithWrap(err)) + return "", errors.New(ctx, errors.Encrypt, op, "unable to encrypt message", errors.WithWrap(err)) } marshaledBlob, err := proto.Marshal(blobInfo) if err != nil { - return "", errors.Wrap(err, op, errors.WithMsg("unable to marshal blob"), errors.WithCode(errors.Encode)) + return "", errors.Wrap(ctx, err, op, errors.WithMsg("unable to marshal blob"), errors.WithCode(errors.Encode)) } wrapped := &request.Wrapper{ AuthMethodId: am.PublicId, @@ -106,12 +106,12 @@ func encryptMessage(ctx context.Context, wrapper wrapping.Wrapper, am *AuthMetho WrapperKeyId: wrapper.KeyID(), Ct: marshaledBlob, } - if err := wrapped.Validate(); err != nil { - return "", errors.Wrap(err, op) + if err := wrapped.Validate(ctx); err != nil { + return "", errors.Wrap(ctx, err, op) } marshaledEncryptedSt, err := proto.Marshal(wrapped) if err != nil { - return "", errors.New(errors.Unknown, op, "unable to marshal encrypted message", errors.WithWrap(err)) + return "", errors.New(ctx, errors.Unknown, op, "unable to marshal encrypted message", errors.WithWrap(err)) } return base58.FastBase58Encoding(marshaledEncryptedSt), nil @@ -122,19 +122,19 @@ func encryptMessage(ctx context.Context, wrapper wrapping.Wrapper, am *AuthMetho func decryptMessage(ctx context.Context, wrappingWrapper wrapping.Wrapper, wrappedRequest *request.Wrapper) (messageBytes []byte, e error) { const op = "oidc.decryptMessage" if wrappedRequest == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing wrapped request") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing wrapped request") } if wrappingWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing wrapping wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing wrapping wrapper") } var blobInfo wrapping.EncryptedBlobInfo if err := proto.Unmarshal(wrappedRequest.Ct, &blobInfo); err != nil { - return nil, errors.New(errors.Unknown, op, "unable to marshal blob info", errors.WithWrap(err)) + return nil, errors.New(ctx, errors.Unknown, op, "unable to marshal blob info", errors.WithWrap(err)) } decryptedMsg, err := wrappingWrapper.Decrypt(ctx, &blobInfo, []byte(fmt.Sprintf("%s%s", wrappedRequest.AuthMethodId, wrappedRequest.ScopeId))) if err != nil { - return nil, errors.New(errors.Decrypt, op, "unable to decrypt message", errors.WithWrap(err)) + return nil, errors.New(ctx, errors.Decrypt, op, "unable to decrypt message", errors.WithWrap(err)) } return decryptedMsg, nil } @@ -144,11 +144,11 @@ func UnwrapMessage(ctx context.Context, encodedWrappedMsg string) (*request.Wrap const op = "" decoded, err := base58.FastBase58Decoding(encodedWrappedMsg) if err != nil { - return nil, errors.New(errors.Unknown, op, "unable to decode message", errors.WithWrap(err)) + return nil, errors.New(ctx, errors.Unknown, op, "unable to decode message", errors.WithWrap(err)) } var wrapper request.Wrapper if err := proto.Unmarshal(decoded, &wrapper); err != nil { - return nil, errors.New(errors.Unknown, op, "unable to marshal encoded/encrypted message", errors.WithWrap(err)) + return nil, errors.New(ctx, errors.Unknown, op, "unable to marshal encoded/encrypted message", errors.WithWrap(err)) } return &wrapper, nil } @@ -166,19 +166,19 @@ func UnwrapMessage(ctx context.Context, encodedWrappedMsg string) (*request.Wrap func requestWrappingWrapper(ctx context.Context, k *kms.Kms, scopeId, authMethodId string, opt ...Option) (wrapping.Wrapper, error) { const op = "oidc.(Repository).oidcWrapper" if k == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing kms") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing kms") } if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } if authMethodId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing auth method id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing auth method id") } opts := getOpts(opt...) // get a specific oidcWrapper using the WithKeyId(...) option oidcWrapper, err := k.GetWrapper(ctx, scopeId, kms.KeyPurposeOidc, kms.WithKeyId(opts.withKeyId)) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oidc wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oidc wrapper")) } // What derived key are we looking for? @@ -191,20 +191,20 @@ func requestWrappingWrapper(ctx context.Context, k *kms.Kms, scopeId, authMethod // okay, I guess we need to derive a new key for this combo of oidcWrapper and authMethod reader, err := kms.NewDerivedReader(oidcWrapper, 32, []byte(authMethodId), []byte(scopeId)) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } privKey, _, err := ed25519.GenerateKey(reader) if err != nil { - return nil, errors.New(errors.Encrypt, op, "unable to generate key", errors.WithWrap(err)) + return nil, errors.New(ctx, errors.Encrypt, op, "unable to generate key", errors.WithWrap(err)) } wrapper := aead.NewWrapper(nil) if _, err := wrapper.SetConfig(map[string]string{ "key_id": keyId, }); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error setting config on aead wrapper in auth method %s", authMethodId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error setting config on aead wrapper in auth method %s", authMethodId))) } if err := wrapper.SetAESGCMKeyBytes(privKey); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error setting key bytes on aead wrapper in auth method %s", authMethodId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error setting key bytes on aead wrapper in auth method %s", authMethodId))) } // store the derived key in our cache k.GetDerivedPurposeCache().Store(keyId, wrapper) diff --git a/internal/auth/oidc/service_callback.go b/internal/auth/oidc/service_callback.go index 9762d58ea..667d9e3b0 100644 --- a/internal/auth/oidc/service_callback.go +++ b/internal/auth/oidc/service_callback.go @@ -52,22 +52,22 @@ func Callback( state, code string) (finalRedirect string, e error) { const op = "oidc.Callback" if oidcRepoFn == nil { - return "", errors.New(errors.InvalidParameter, op, "missing oidc repository function") + return "", errors.New(ctx, errors.InvalidParameter, op, "missing oidc repository function") } if iamRepoFn == nil { - return "", errors.New(errors.InvalidParameter, op, "missing iam repository function") + return "", errors.New(ctx, errors.InvalidParameter, op, "missing iam repository function") } if atRepoFn == nil { - return "", errors.New(errors.InvalidParameter, op, "missing auth token repository function") + return "", errors.New(ctx, errors.InvalidParameter, op, "missing auth token repository function") } if am == nil { - return "", errors.New(errors.InvalidParameter, op, "missing auth method") + return "", errors.New(ctx, errors.InvalidParameter, op, "missing auth method") } if state == "" { - return "", errors.New(errors.InvalidParameter, op, "missing state") + return "", errors.New(ctx, errors.InvalidParameter, op, "missing state") } if code == "" { - return "", errors.New(errors.InvalidParameter, op, "missing code") + return "", errors.New(ctx, errors.InvalidParameter, op, "missing code") } // One comment before we begin, Callback orchestrates repositories which @@ -82,55 +82,55 @@ func Callback( r, err := oidcRepoFn() if err != nil { - return "", errors.Wrap(err, op) + return "", errors.Wrap(ctx, err, op) } // state is a proto request.Wrapper msg, which contains a cipher text field, so // we need the derived wrapper that was used to encrypt it. requestWrapper, err := requestWrappingWrapper(ctx, r.kms, am.ScopeId, am.GetPublicId()) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.Wrap(ctx, err, op) } stateWrapper, err := UnwrapMessage(ctx, state) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.Wrap(ctx, err, op) } // it appears the authentication request was started with one auth method // and the callback came to a different auth method. if stateWrapper.AuthMethodId != am.GetPublicId() { - return "", errors.New(errors.InvalidParameter, op, fmt.Sprintf("%s auth method id does not match request wrapper auth method id: %s", am.GetPublicId(), stateWrapper)) + return "", errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s auth method id does not match request wrapper auth method id: %s", am.GetPublicId(), stateWrapper)) } stateBytes, err := decryptMessage(ctx, requestWrapper, stateWrapper) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.Wrap(ctx, err, op) } var reqState request.State if err := proto.Unmarshal(stateBytes, &reqState); err != nil { - return "", errors.New(errors.Unknown, op, "unable to unmarshal request state", errors.WithWrap(err)) + return "", errors.New(ctx, errors.Unknown, op, "unable to unmarshal request state", errors.WithWrap(err)) } // get the provider from the cache (if possible). FYI: "get" just does the right thing // about comparing the cache with the auth method from the db. provider, err := providerCache().get(ctx, am) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.Wrap(ctx, err, op) } // if auth method is inactive, we don't allow inflight requests to finish if the // auth method's config has changed since the request was kicked off. hash, err := provider.ConfigHash() if err != nil { - return "", errors.New(errors.Unknown, op, "unable to get provider config hash", errors.WithWrap(err)) + return "", errors.New(ctx, errors.Unknown, op, "unable to get provider config hash", errors.WithWrap(err)) } if reqState.ProviderConfigHash != hash && am.OperationalState == string(InactiveState) { - return "", errors.New(errors.AuthMethodInactive, op, "auth method configuration changed during in-flight authentication attempt") + return "", errors.New(ctx, errors.AuthMethodInactive, op, "auth method configuration changed during in-flight authentication attempt") } // before proceeding, make sure the request hasn't timed out if time.Now().After(reqState.ExpirationTime.Timestamp.AsTime()) { - return "", errors.New(errors.AuthAttemptExpired, op, "request state has expired") + return "", errors.New(ctx, errors.AuthAttemptExpired, op, "request state has expired") } // now, we need to prep for the token exchange with the oidc provider, which @@ -151,15 +151,15 @@ func Callback( opts = append(opts, oidc.WithAudiences(am.AudClaims...)) } if strings.TrimSpace(am.ApiUrl) == "" { - return "", errors.New(errors.InvalidParameter, op, "empty api URL") + return "", errors.New(ctx, errors.InvalidParameter, op, "empty api URL") } oidcRequest, err := oidc.NewRequest(AttemptExpiration, fmt.Sprintf(CallbackEndpoint, am.ApiUrl), opts...) if err != nil { - return "", errors.New(errors.Unknown, op, "unable to create oidc request for token exchange", errors.WithWrap(err)) + return "", errors.New(ctx, errors.Unknown, op, "unable to create oidc request for token exchange", errors.WithWrap(err)) } tk, err := provider.Exchange(ctx, oidcRequest, state, code) if err != nil { - return "", errors.New(errors.Unknown, op, "unable to complete exchange with oidc provider", errors.WithWrap(err)) + return "", errors.New(ctx, errors.Unknown, op, "unable to complete exchange with oidc provider", errors.WithWrap(err)) } // okay, now we need some claims from both the ID Token and userinfo, so we can @@ -168,29 +168,29 @@ func Callback( userInfoClaims := map[string]interface{}{} // intentionally, NOT nil for call to upsertAccount(...) if err := tk.IDToken().Claims(&idTkClaims); err != nil { - return "", errors.New(errors.Unknown, op, "unable to parse ID Token claims", errors.WithWrap(err)) + return "", errors.New(ctx, errors.Unknown, op, "unable to parse ID Token claims", errors.WithWrap(err)) } userInfoTokenSource := tk.StaticTokenSource() if userInfoTokenSource != nil { sub, ok := idTkClaims["sub"].(string) if !ok { - return "", errors.New(errors.Unknown, op, "subject is not present in ID Token, which should not be possible") + return "", errors.New(ctx, errors.Unknown, op, "subject is not present in ID Token, which should not be possible") } if err := provider.UserInfo(ctx, userInfoTokenSource, sub, &userInfoClaims); err != nil { - return "", errors.New(errors.Unknown, op, "unable to get user info from provider", errors.WithWrap(err)) + return "", errors.New(ctx, errors.Unknown, op, "unable to get user info from provider", errors.WithWrap(err)) } } acct, err := r.upsertAccount(ctx, am, idTkClaims, userInfoClaims) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.Wrap(ctx, err, op) } // Get the set of all managed groups so we can filter mgs, err := r.ListManagedGroups(ctx, am.GetPublicId()) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.Wrap(ctx, err, op) } if len(mgs) > 0 { matchedMgs := make([]*ManagedGroup, 0, len(mgs)) @@ -204,11 +204,11 @@ func Callback( if err != nil { // We check all filters on ingress so this should never happen, // but we validate anyways - return "", errors.Wrap(err, op) + return "", errors.Wrap(ctx, err, op) } match, err := eval.Evaluate(evalData) if err != nil && !errors.Is(err, pointerstructure.ErrNotFound) { - return "", errors.Wrap(err, op) + return "", errors.Wrap(ctx, err, op) } if match { matchedMgs = append(matchedMgs, mg) @@ -217,7 +217,7 @@ func Callback( // We always pass it in, even if none match, because in that case we // need to remove any mappings that exist if _, _, err := r.SetManagedGroupMemberships(ctx, am, acct, matchedMgs); err != nil { - return "", errors.Wrap(err, op) + return "", errors.Wrap(ctx, err, op) } } @@ -226,17 +226,17 @@ func Callback( // autovivify users for the scope. iamRepo, err := iamRepoFn() if err != nil { - return "", errors.Wrap(err, op) + return "", errors.Wrap(ctx, err, op) } scope, err := iamRepo.LookupScope(ctx, am.ScopeId) if err != nil { - return "", errors.Wrap(err, op, errors.WithMsg("unable to lookup account scope: "+scope.PublicId)) + return "", errors.Wrap(ctx, err, op, errors.WithMsg("unable to lookup account scope: "+scope.PublicId)) } user, err := iamRepo.LookupUserWithLogin(ctx, acct.PublicId) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.Wrap(ctx, err, op) } // Now we need to check filters and assign managed groups by filter. @@ -246,13 +246,13 @@ func Callback( // that initialed the authentication attempt. tokenRepo, err := atRepoFn() if err != nil { - return "", errors.Wrap(err, op) + return "", errors.Wrap(ctx, err, op) } if _, err := tokenRepo.CreateAuthToken(ctx, user, acct.PublicId, authtoken.WithPublicId(reqState.TokenRequestId), authtoken.WithStatus(authtoken.PendingStatus)); err != nil { if errors.Match(errors.T(errors.NotUnique), err) { - return "", errors.New(errors.Forbidden, op, "not a unique request", errors.WithWrap(err)) + return "", errors.New(ctx, errors.Forbidden, op, "not a unique request", errors.WithWrap(err)) } - return "", errors.Wrap(err, op) + return "", errors.Wrap(ctx, err, op) } // tada! we can return a final redirect URL for the successful authentication. return reqState.FinalRedirectUrl, nil diff --git a/internal/auth/oidc/service_callback_test.go b/internal/auth/oidc/service_callback_test.go index 1652be223..e5962f9e1 100644 --- a/internal/auth/oidc/service_callback_test.go +++ b/internal/auth/oidc/service_callback_test.go @@ -41,7 +41,7 @@ func Test_Callback(t *testing.T) { return iam.NewRepository(rw, rw, kmsCache) } repoFn := func() (*Repository, error) { - return NewRepository(rw, rw, kmsCache) + return NewRepository(ctx, rw, rw, kmsCache) } atRepoFn := func() (*authtoken.Repository, error) { return authtoken.NewRepository(rw, rw, kmsCache) @@ -65,7 +65,7 @@ func Test_Callback(t *testing.T) { // test provider for the tests (see the oidc package docs for more info) // it will provide discovery, JWKs, a token endpoint, etc for these tests. tp := oidc.StartTestProvider(t) - tpCert, err := ParseCertificates(tp.CACert()) + tpCert, err := ParseCertificates(ctx, tp.CACert()) require.NoError(t, err) _, _, tpAlg, _ := tp.SigningKeys() @@ -513,7 +513,7 @@ func Test_StartAuth_to_Callback(t *testing.T) { return iam.NewRepository(rw, rw, kmsCache) } repoFn := func() (*Repository, error) { - return NewRepository(rw, rw, kmsCache) + return NewRepository(ctx, rw, rw, kmsCache) } atRepoFn := func() (*authtoken.Repository, error) { return authtoken.NewRepository(rw, rw, kmsCache) @@ -531,7 +531,7 @@ func Test_StartAuth_to_Callback(t *testing.T) { // the testing OIDC provider (it's a functional fake, see the package docs) tp := oidc.StartTestProvider(t) - tpCert, err := ParseCertificates(tp.CACert()) + tpCert, err := ParseCertificates(ctx, tp.CACert()) require.NoError(err) _, _, tpAlg, _ := tp.SigningKeys() @@ -617,7 +617,7 @@ func Test_ManagedGroupFiltering(t *testing.T) { return iam.NewRepository(rw, rw, kmsCache) } repoFn := func() (*Repository, error) { - return NewRepository(rw, rw, kmsCache) + return NewRepository(ctx, rw, rw, kmsCache) } atRepoFn := func() (*authtoken.Repository, error) { return authtoken.NewRepository(rw, rw, kmsCache) @@ -639,7 +639,7 @@ func Test_ManagedGroupFiltering(t *testing.T) { // test provider for the tests (see the oidc package docs for more info) // it will provide discovery, JWKs, a token endpoint, etc for these tests. tp := oidc.StartTestProvider(t) - tpCert, err := ParseCertificates(tp.CACert()) + tpCert, err := ParseCertificates(ctx, tp.CACert()) require.NoError(t, err) _, _, tpAlg, _ := tp.SigningKeys() diff --git a/internal/auth/oidc/service_start_auth.go b/internal/auth/oidc/service_start_auth.go index 7bcf9a04d..e3fdc2d52 100644 --- a/internal/auth/oidc/service_start_auth.go +++ b/internal/auth/oidc/service_start_auth.go @@ -33,30 +33,30 @@ import ( func StartAuth(ctx context.Context, oidcRepoFn OidcRepoFactory, authMethodId string, opt ...Option) (authUrl *url.URL, tokenId string, e error) { const op = "oidc.StartAuth" if authMethodId == "" { - return nil, "", errors.New(errors.InvalidParameter, op, "missing auth method id") + return nil, "", errors.New(ctx, errors.InvalidParameter, op, "missing auth method id") } if oidcRepoFn == nil { - return nil, "", errors.New(errors.InvalidParameter, op, "missing oidc repo function") + return nil, "", errors.New(ctx, errors.InvalidParameter, op, "missing oidc repo function") } r, err := oidcRepoFn() if err != nil { - return nil, "", errors.Wrap(err, op) + return nil, "", errors.Wrap(ctx, err, op) } am, err := r.lookupAuthMethod(ctx, authMethodId) if err != nil { - return nil, "", errors.Wrap(err, op) + return nil, "", errors.Wrap(ctx, err, op) } if am == nil { - return nil, "", errors.New(errors.RecordNotFound, op, fmt.Sprintf("auth method %s not found", authMethodId)) + return nil, "", errors.New(ctx, errors.RecordNotFound, op, fmt.Sprintf("auth method %s not found", authMethodId)) } if am.OperationalState == string(InactiveState) { - return nil, "", errors.New(errors.AuthMethodInactive, op, "not allowed to start authentication attempt") + return nil, "", errors.New(ctx, errors.AuthMethodInactive, op, "not allowed to start authentication attempt") } // get the provider from the cache (if possible) provider, err := providerCache().get(ctx, am) if err != nil { - return nil, "", errors.Wrap(err, op) + return nil, "", errors.Wrap(ctx, err, op) } callbackRedirect := fmt.Sprintf(CallbackEndpoint, am.GetApiUrl()) @@ -72,15 +72,15 @@ func StartAuth(ctx context.Context, oidcRepoFn OidcRepoFactory, authMethodId str exp := timestamppb.New(now.Add(AttemptExpiration).Truncate(time.Second)) tokenRequestId, err := authtoken.NewAuthTokenId() if err != nil { - return nil, "", errors.Wrap(err, op) + return nil, "", errors.Wrap(ctx, err, op) } nonce, err := oidc.NewID() if err != nil { - return nil, "", errors.New(errors.Unknown, op, "unable to generate nonce", errors.WithWrap(err)) + return nil, "", errors.New(ctx, errors.Unknown, op, "unable to generate nonce", errors.WithWrap(err)) } hash, err := provider.ConfigHash() if err != nil { - return nil, "", errors.New(errors.Unknown, op, "unable to get provider config hash", errors.WithWrap(err)) + return nil, "", errors.New(ctx, errors.Unknown, op, "unable to get provider config hash", errors.WithWrap(err)) } st := &request.State{ TokenRequestId: tokenRequestId, @@ -93,11 +93,11 @@ func StartAuth(ctx context.Context, oidcRepoFn OidcRepoFactory, authMethodId str requestWrapper, err := requestWrappingWrapper(ctx, r.kms, am.ScopeId, authMethodId) if err != nil { - return nil, "", errors.Wrap(err, op) + return nil, "", errors.Wrap(ctx, err, op) } encodedEncryptedSt, err := encryptMessage(ctx, requestWrapper, am, st) if err != nil { - return nil, "", errors.Wrap(err, op) + return nil, "", errors.Wrap(ctx, err, op) } oidcOpts := []oidc.Option{ oidc.WithState(string(encodedEncryptedSt)), @@ -123,16 +123,16 @@ func StartAuth(ctx context.Context, oidcRepoFn OidcRepoFactory, authMethodId str callbackRedirect, oidcOpts...) if err != nil { - return nil, "", errors.New(errors.Unknown, op, "unable to create oidc request", errors.WithWrap(err)) + return nil, "", errors.New(ctx, errors.Unknown, op, "unable to create oidc request", errors.WithWrap(err)) } u, err := provider.AuthURL(ctx, oidcReq) if err != nil { - return nil, "", errors.New(errors.Unknown, op, "unable to get auth url from provider", errors.WithWrap(err)) + return nil, "", errors.New(ctx, errors.Unknown, op, "unable to get auth url from provider", errors.WithWrap(err)) } authUrl, err = url.Parse(u) if err != nil { - return nil, "", errors.New(errors.Unknown, op, "unable to parse auth url", errors.WithWrap(err)) + return nil, "", errors.New(ctx, errors.Unknown, op, "unable to parse auth url", errors.WithWrap(err)) } t := &request.Token{ @@ -141,7 +141,7 @@ func StartAuth(ctx context.Context, oidcRepoFn OidcRepoFactory, authMethodId str } encodedEncryptedTk, err := encryptMessage(ctx, requestWrapper, am, t) if err != nil { - return nil, "", errors.Wrap(err, op) + return nil, "", errors.Wrap(ctx, err, op) } return authUrl, encodedEncryptedTk, nil } diff --git a/internal/auth/oidc/service_start_auth_test.go b/internal/auth/oidc/service_start_auth_test.go index d2ba56b40..b280b0ce0 100644 --- a/internal/auth/oidc/service_start_auth_test.go +++ b/internal/auth/oidc/service_start_auth_test.go @@ -28,7 +28,7 @@ func Test_StartAuth(t *testing.T) { ctx := context.Background() tp := oidc.StartTestProvider(t) _, _, tpAlg, _ := tp.SigningKeys() - tpCert, err := ParseCertificates(tp.CACert()) + tpCert, err := ParseCertificates(ctx, tp.CACert()) require.NoError(t, err) conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) @@ -40,7 +40,7 @@ func Test_StartAuth(t *testing.T) { defer testController.Close() repoFn := func() (*Repository, error) { - return NewRepository(rw, rw, kmsCache) + return NewRepository(ctx, rw, rw, kmsCache) } org, _ := iam.TestScopes(t, iam.TestRepo(t, conn, rootWrapper)) databaseWrapper, err := kmsCache.GetWrapper(ctx, org.PublicId, kms.KeyPurposeDatabase) diff --git a/internal/auth/oidc/service_test.go b/internal/auth/oidc/service_test.go index 0013da1a7..084b825a4 100644 --- a/internal/auth/oidc/service_test.go +++ b/internal/auth/oidc/service_test.go @@ -180,7 +180,7 @@ func Test_requestWrappingWrapper(t *testing.T) { kmsCache := kms.TestKms(t, conn, rootWrapper) rw := db.New(conn) - repo, err := NewRepository(rw, rw, kmsCache) + repo, err := NewRepository(ctx, rw, rw, kmsCache) require.NoError(t, err) org, _ := iam.TestScopes(t, iam.TestRepo(t, conn, rootWrapper)) databaseWrapper, err := kmsCache.GetWrapper(ctx, org.PublicId, kms.KeyPurposeDatabase) diff --git a/internal/auth/oidc/service_token_request.go b/internal/auth/oidc/service_token_request.go index 7d246b35a..70733d646 100644 --- a/internal/auth/oidc/service_token_request.go +++ b/internal/auth/oidc/service_token_request.go @@ -25,59 +25,59 @@ import ( func TokenRequest(ctx context.Context, kms *kms.Kms, atRepoFn AuthTokenRepoFactory, authMethodId, tokenRequestId string) (*authtoken.AuthToken, error) { const op = "oidc.TokenRequest" if kms == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing kms") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing kms") } if atRepoFn == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing auth token repo function") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing auth token repo function") } if authMethodId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing auth method id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing auth method id") } if tokenRequestId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing token request id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing token request id") } reqTkWrapper, err := UnwrapMessage(ctx, tokenRequestId) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if reqTkWrapper.ScopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "request token id wrapper missing scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "request token id wrapper missing scope id") } if reqTkWrapper.AuthMethodId == "" { - return nil, errors.New(errors.InvalidParameter, op, "request token id wrapper missing auth method id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "request token id wrapper missing auth method id") } if reqTkWrapper.AuthMethodId != authMethodId { - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("%s auth method id does not match request wrapper auth method id: %s", authMethodId, reqTkWrapper.AuthMethodId)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s auth method id does not match request wrapper auth method id: %s", authMethodId, reqTkWrapper.AuthMethodId)) } // tokenRequestId is a proto request.Wrapper, which contains a cipher text field, // so we need the derived wrapper that was used to encrypt it. requestWrapper, err := requestWrappingWrapper(ctx, kms, reqTkWrapper.ScopeId, reqTkWrapper.AuthMethodId) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } reqTkBytes, err := decryptMessage(ctx, requestWrapper, reqTkWrapper) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } var reqTk request.Token if err := proto.Unmarshal(reqTkBytes, &reqTk); err != nil { - return nil, errors.New(errors.Unknown, op, "unable to unmarshal request token", errors.WithWrap(err)) + return nil, errors.New(ctx, errors.Unknown, op, "unable to unmarshal request token", errors.WithWrap(err)) } if reqTk.ExpirationTime == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing request token id expiration time") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing request token id expiration time") } // before proceeding, make sure the request hasn't timed out if time.Now().After(reqTk.ExpirationTime.Timestamp.AsTime()) { - return nil, errors.New(errors.AuthAttemptExpired, op, "request token id has expired") + return nil, errors.New(ctx, errors.AuthAttemptExpired, op, "request token id has expired") } tokenRepo, err := atRepoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } authTk, err := tokenRepo.IssueAuthToken(ctx, reqTk.RequestId) if err != nil { @@ -86,10 +86,10 @@ func TokenRequest(ctx context.Context, kms *kms.Kms, atRepoFn AuthTokenRepoFacto // error, but nothing is returned. return nil, nil } - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if authTk.Token == "" { - return nil, errors.New(errors.Internal, op, "issued token is missing") + return nil, errors.New(ctx, errors.Internal, op, "issued token is missing") } return authTk, nil } diff --git a/internal/auth/oidc/service_token_request_test.go b/internal/auth/oidc/service_token_request_test.go index 9efd4f314..a758d47d2 100644 --- a/internal/auth/oidc/service_token_request_test.go +++ b/internal/auth/oidc/service_token_request_test.go @@ -163,7 +163,7 @@ func Test_TokenRequest(t *testing.T) { name: "atRepoFn-error", kms: kmsCache, atRepoFn: func() (*authtoken.Repository, error) { - return nil, errors.New(errors.Unknown, "test op", "atRepoFn-error") + return nil, errors.New(ctx, errors.Unknown, "test op", "atRepoFn-error", errors.WithoutEvent()) }, authMethodId: testAuthMethod.PublicId, tokenRequest: func() string { diff --git a/internal/auth/oidc/signing_alg.go b/internal/auth/oidc/signing_alg.go index a88988b3e..c93fee10e 100644 --- a/internal/auth/oidc/signing_alg.go +++ b/internal/auth/oidc/signing_alg.go @@ -1,6 +1,7 @@ package oidc import ( + "context" "fmt" "github.com/hashicorp/boundary/internal/auth/oidc/store" @@ -55,7 +56,7 @@ type SigningAlg struct { // NewSigningAlg creates a new in memory signing alg assigned to an OIDC // AuthMethod. It supports no options. -func NewSigningAlg(authMethodId string, alg Alg) (*SigningAlg, error) { +func NewSigningAlg(ctx context.Context, authMethodId string, alg Alg) (*SigningAlg, error) { const op = "oidc.NewSigningAlg" s := &SigningAlg{ SigningAlg: &store.SigningAlg{ @@ -63,7 +64,7 @@ func NewSigningAlg(authMethodId string, alg Alg) (*SigningAlg, error) { Alg: string(alg), }, } - if err := s.validate(op); err != nil { + if err := s.validate(ctx, op); err != nil { return nil, err // intentionally not wrapped } return s, nil @@ -76,12 +77,12 @@ func SupportedAlgorithm(a Alg) bool { } // validate the SigningAlg. On success, it will return nil. -func (s *SigningAlg) validate(caller errors.Op) error { +func (s *SigningAlg) validate(ctx context.Context, caller errors.Op) error { if s.OidcMethodId == "" { - return errors.New(errors.InvalidParameter, caller, "missing oidc auth method id") + return errors.New(ctx, errors.InvalidParameter, caller, "missing oidc auth method id") } if _, ok := supportedAlgorithms[Alg(s.Alg)]; !ok { - return errors.New(errors.InvalidParameter, caller, fmt.Sprintf("unsupported signing algorithm: %s", s.Alg)) + return errors.New(ctx, errors.InvalidParameter, caller, fmt.Sprintf("unsupported signing algorithm: %s", s.Alg)) } return nil } diff --git a/internal/auth/oidc/signing_alg_test.go b/internal/auth/oidc/signing_alg_test.go index a863b75b7..0e37aa349 100644 --- a/internal/auth/oidc/signing_alg_test.go +++ b/internal/auth/oidc/signing_alg_test.go @@ -15,6 +15,7 @@ import ( func TestSigningAlg_Create(t *testing.T) { t.Parallel() + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrapper) @@ -102,7 +103,7 @@ func TestSigningAlg_Create(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - got, err := NewSigningAlg(tt.args.authMethodId, tt.args.alg) + got, err := NewSigningAlg(ctx, tt.args.authMethodId, tt.args.alg) if tt.wantErr { require.Error(err) assert.True(errors.Match(errors.T(tt.wantIsErr), err)) @@ -130,6 +131,7 @@ func TestSigningAlg_Create(t *testing.T) { func TestSigningAlg_Delete(t *testing.T) { t.Parallel() + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrapper) @@ -153,7 +155,7 @@ func TestSigningAlg_Delete(t *testing.T) { WithSigningAlgs(RS256)) // seed an extra callback url to just make sure the delete only gets the right num of rows testResource := func(authMethodId string, signingAlg Alg) *SigningAlg { - c, err := NewSigningAlg(authMethodId, signingAlg) + c, err := NewSigningAlg(ctx, authMethodId, signingAlg) require.NoError(t, err) return c } @@ -216,6 +218,7 @@ func TestSigningAlg_Delete(t *testing.T) { func TestSigningAlg_Clone(t *testing.T) { t.Parallel() + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") wrapper := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrapper) @@ -227,7 +230,7 @@ func TestSigningAlg_Clone(t *testing.T) { require.NoError(err) m := TestAuthMethod(t, conn, databaseWrapper, org.PublicId, InactiveState, "alice_rp", "my-dogs-name", WithIssuer(TestConvertToUrls(t, "https://alice.com")[0]), WithApiUrl(TestConvertToUrls(t, "https://api.com")[0])) - orig, err := NewSigningAlg(m.PublicId, RS256) + orig, err := NewSigningAlg(ctx, m.PublicId, RS256) require.NoError(err) cp := orig.Clone() assert.True(proto.Equal(cp.SigningAlg, orig.SigningAlg)) @@ -239,9 +242,9 @@ func TestSigningAlg_Clone(t *testing.T) { require.NoError(err) m := TestAuthMethod(t, conn, databaseWrapper, org.PublicId, InactiveState, "alice_rp", "my-dogs-name", WithIssuer(TestConvertToUrls(t, "https://alice.com")[0]), WithApiUrl(TestConvertToUrls(t, "https://api.com")[0])) - orig, err := NewSigningAlg(m.PublicId, ES256) + orig, err := NewSigningAlg(ctx, m.PublicId, ES256) require.NoError(err) - orig2, err := NewSigningAlg(m.PublicId, ES384) + orig2, err := NewSigningAlg(ctx, m.PublicId, ES384) require.NoError(err) cp := orig.Clone() diff --git a/internal/auth/oidc/testing.go b/internal/auth/oidc/testing.go index 8bf403409..2548cc975 100644 --- a/internal/auth/oidc/testing.go +++ b/internal/auth/oidc/testing.go @@ -49,14 +49,14 @@ func TestAuthMethod( clientSecret ClientSecret, opt ...Option) *AuthMethod { t.Helper() + ctx := context.TODO() opts := getOpts(opt...) require := require.New(t) rw := db.New(conn) - ctx := context.Background() - authMethod, err := NewAuthMethod(scopeId, clientId, clientSecret, opt...) + authMethod, err := NewAuthMethod(ctx, scopeId, clientId, clientSecret, opt...) require.NoError(err) - id, err := newAuthMethodId() + id, err := newAuthMethodId(ctx) require.NoError(err) authMethod.PublicId = id err = authMethod.encrypt(ctx, databaseWrapper) @@ -67,7 +67,7 @@ func TestAuthMethod( if len(opts.withAudClaims) > 0 { newAudClaims := make([]interface{}, 0, len(opts.withAudClaims)) for _, a := range opts.withAudClaims { - aud, err := NewAudClaim(authMethod.PublicId, a) + aud, err := NewAudClaim(ctx, authMethod.PublicId, a) require.NoError(err) newAudClaims = append(newAudClaims, aud) } @@ -78,9 +78,9 @@ func TestAuthMethod( if len(opts.withCertificates) > 0 { newCerts := make([]interface{}, 0, len(opts.withCertificates)) for _, c := range opts.withCertificates { - pem, err := EncodeCertificates(c) + pem, err := EncodeCertificates(ctx, c) require.NoError(err) - cert, err := NewCertificate(authMethod.PublicId, pem[0]) + cert, err := NewCertificate(ctx, authMethod.PublicId, pem[0]) require.NoError(err) newCerts = append(newCerts, cert) } @@ -91,7 +91,7 @@ func TestAuthMethod( if len(opts.withSigningAlgs) > 0 { newAlgs := make([]interface{}, 0, len(opts.withSigningAlgs)) for _, a := range opts.withSigningAlgs { - alg, err := NewSigningAlg(authMethod.PublicId, a) + alg, err := NewSigningAlg(ctx, authMethod.PublicId, a) require.NoError(err) newAlgs = append(newAlgs, alg) } @@ -102,7 +102,7 @@ func TestAuthMethod( if len(opts.withClaimsScopes) > 0 { newClaimsScopes := make([]interface{}, 0, len(opts.withClaimsScopes)) for _, cs := range opts.withClaimsScopes { - s, err := NewClaimsScope(authMethod.PublicId, cs) + s, err := NewClaimsScope(ctx, authMethod.PublicId, cs) require.NoError(err) newClaimsScopes = append(newClaimsScopes, s) } @@ -113,7 +113,7 @@ func TestAuthMethod( if len(opts.withAccountClaimMap) > 0 { newAccountClaimMaps := make([]interface{}, 0, len(opts.withAccountClaimMap)) for k, v := range opts.withAccountClaimMap { - acm, err := NewAccountClaimMap(authMethod.PublicId, k, v) + acm, err := NewAccountClaimMap(ctx, authMethod.PublicId, k, v) require.NoError(err) newAccountClaimMaps = append(newAccountClaimMaps, acm) } @@ -167,10 +167,10 @@ func TestAccount(t *testing.T, conn *gorm.DB, am *AuthMethod, subject string, op u, err := url.Parse(am.GetIssuer()) require.NoError(err) opt = append(opt, WithIssuer(u)) - a, err := NewAccount(am.PublicId, subject, opt...) + a, err := NewAccount(ctx, am.PublicId, subject, opt...) require.NoError(err) - id, err := newAccountId(am.GetPublicId(), am.Issuer, subject) + id, err := newAccountId(ctx, am.GetPublicId(), am.Issuer, subject) require.NoError(err) a.PublicId = id @@ -185,10 +185,10 @@ func TestManagedGroup(t *testing.T, conn *gorm.DB, am *AuthMethod, filter string rw := db.New(conn) ctx := context.Background() - mg, err := NewManagedGroup(am.PublicId, filter, opt...) + mg, err := NewManagedGroup(ctx, am.PublicId, filter, opt...) require.NoError(err) - id, err := newManagedGroupId() + id, err := newManagedGroupId(ctx) require.NoError(err) mg.PublicId = id @@ -203,7 +203,7 @@ func TestManagedGroupMember(t *testing.T, conn *gorm.DB, managedGroupId, memberI rw := db.New(conn) ctx := context.Background() - mg, err := NewManagedGroupMemberAccount(managedGroupId, memberId, opt...) + mg, err := NewManagedGroupMemberAccount(ctx, managedGroupId, memberId, opt...) require.NoError(err) require.NoError(rw.Create(ctx, mg)) diff --git a/internal/auth/password/account.go b/internal/auth/password/account.go index 4334cbc76..c4ef1ca1d 100644 --- a/internal/auth/password/account.go +++ b/internal/auth/password/account.go @@ -30,7 +30,7 @@ func NewAccount(authMethodId string, opt ...Option) (*Account, error) { // NOTE(mgaffney): The scopeId in the embedded *store.Account is // populated by a trigger in the database. if authMethodId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing auth method id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing auth method id") } opts := getOpts(opt...) diff --git a/internal/auth/password/argon2.go b/internal/auth/password/argon2.go index e1d0f2eac..65b043a65 100644 --- a/internal/auth/password/argon2.go +++ b/internal/auth/password/argon2.go @@ -45,25 +45,25 @@ func NewArgon2Configuration() *Argon2Configuration { func (c *Argon2Configuration) validate() error { const op = "password.(Argon2Configuration).validate" if c == nil { - return errors.New(errors.PasswordInvalidConfiguration, op, "missing config") + return errors.NewDeprecated(errors.PasswordInvalidConfiguration, op, "missing config") } if c.Argon2Configuration == nil { - return errors.New(errors.PasswordInvalidConfiguration, op, "missing embedded config") + return errors.NewDeprecated(errors.PasswordInvalidConfiguration, op, "missing embedded config") } if c.Iterations == 0 { - return errors.New(errors.PasswordInvalidConfiguration, op, "missing iterations") + return errors.NewDeprecated(errors.PasswordInvalidConfiguration, op, "missing iterations") } if c.Memory == 0 { - return errors.New(errors.PasswordInvalidConfiguration, op, "missing memory") + return errors.NewDeprecated(errors.PasswordInvalidConfiguration, op, "missing memory") } if c.Threads == 0 { - return errors.New(errors.PasswordInvalidConfiguration, op, "missing threads") + return errors.NewDeprecated(errors.PasswordInvalidConfiguration, op, "missing threads") } if c.SaltLength == 0 { - return errors.New(errors.PasswordInvalidConfiguration, op, "missing salt length") + return errors.NewDeprecated(errors.PasswordInvalidConfiguration, op, "missing salt length") } if c.KeyLength == 0 { - return errors.New(errors.PasswordInvalidConfiguration, op, "missing key length") + return errors.NewDeprecated(errors.PasswordInvalidConfiguration, op, "missing key length") } return nil } @@ -132,18 +132,18 @@ type Argon2Credential struct { func newArgon2Credential(accountId string, password string, conf *Argon2Configuration) (*Argon2Credential, error) { const op = "password.newArgon2Credential" if accountId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing accountId") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing accountId") } if password == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing password") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing password") } if conf == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing argon2 configuration") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing argon2 configuration") } id, err := newArgon2CredentialId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.WrapDeprecated(err, op) } c := &Argon2Credential{ @@ -157,7 +157,7 @@ func newArgon2Credential(accountId string, password string, conf *Argon2Configur salt := make([]byte, conf.SaltLength) if _, err := rand.Read(salt); err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.Io)) + return nil, errors.WrapDeprecated(err, op, errors.WithCode(errors.Io)) } c.Salt = salt c.DerivedKey = argon2.IDKey([]byte(password), c.Salt, conf.Iterations, conf.Memory, uint8(conf.Threads), conf.KeyLength) @@ -187,7 +187,7 @@ func (c *Argon2Credential) SetTableName(n string) { func (c *Argon2Credential) encrypt(ctx context.Context, cipher wrapping.Wrapper) error { const op = "password.(Argon2Credential).encrypt" if err := structwrapping.WrapStruct(ctx, cipher, c.Argon2Credential, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Encrypt)) + return errors.WrapDeprecated(err, op, errors.WithCode(errors.Encrypt)) } c.KeyId = cipher.KeyID() return nil @@ -196,7 +196,7 @@ func (c *Argon2Credential) encrypt(ctx context.Context, cipher wrapping.Wrapper) func (c *Argon2Credential) decrypt(ctx context.Context, cipher wrapping.Wrapper) error { const op = "password.(Argon2Credential).decrypt" if err := structwrapping.UnwrapStruct(ctx, cipher, c.Argon2Credential, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decrypt)) + return errors.WrapDeprecated(err, op, errors.WithCode(errors.Decrypt)) } return nil } diff --git a/internal/auth/password/authmethod.go b/internal/auth/password/authmethod.go index 3a5b8dd8f..505bb9389 100644 --- a/internal/auth/password/authmethod.go +++ b/internal/auth/password/authmethod.go @@ -27,7 +27,7 @@ func allocAuthMethod() AuthMethod { func NewAuthMethod(scopeId string, opt ...Option) (*AuthMethod, error) { const op = "password.NewAuthMethod" if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing scope id") } opts := getOpts(opt...) diff --git a/internal/auth/password/private_ids.go b/internal/auth/password/private_ids.go index 2358240e4..c0e14aca5 100644 --- a/internal/auth/password/private_ids.go +++ b/internal/auth/password/private_ids.go @@ -15,7 +15,7 @@ func newArgon2ConfigurationId() (string, error) { const op = "password.newArgon2ConfigurationId" id, err := db.NewPrivateId(argon2ConfigurationPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } @@ -24,7 +24,7 @@ func newArgon2CredentialId() (string, error) { const op = "password.newArgon2CredentialId" id, err := db.NewPrivateId(argon2CredentialPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } diff --git a/internal/auth/password/public_ids.go b/internal/auth/password/public_ids.go index 286659b86..f55fb48b7 100644 --- a/internal/auth/password/public_ids.go +++ b/internal/auth/password/public_ids.go @@ -26,7 +26,7 @@ func newAuthMethodId() (string, error) { const op = "password.newAuthMethodId" id, err := db.NewPublicId(AuthMethodPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } @@ -35,7 +35,7 @@ func newAccountId() (string, error) { const op = "password.newAccountId" id, err := db.NewPublicId(intglobals.NewPasswordAccountPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } diff --git a/internal/auth/password/repository.go b/internal/auth/password/repository.go index c174d6137..c5d78e65b 100644 --- a/internal/auth/password/repository.go +++ b/internal/auth/password/repository.go @@ -26,11 +26,11 @@ func NewRepository(r db.Reader, w db.Writer, kms *kms.Kms, opt ...Option) (*Repo const op = "password.NewRepository" switch { case r == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing db.Reader") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing db.Reader") case w == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing db.Writer") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing db.Writer") case kms == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing kms") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing kms") } opts := getOpts(opt...) diff --git a/internal/auth/password/repository_account.go b/internal/auth/password/repository_account.go index d2a71bcb7..3bb78540f 100644 --- a/internal/auth/password/repository_account.go +++ b/internal/auth/password/repository_account.go @@ -30,31 +30,31 @@ import ( func (r *Repository) CreateAccount(ctx context.Context, scopeId string, a *Account, opt ...Option) (*Account, error) { const op = "password.(Repository).CreateAccount" if a == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing Account") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing Account") } if a.Account == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing embedded Account") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing embedded Account") } if a.AuthMethodId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing auth method id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing auth method id") } if a.PublicId != "" { - return nil, errors.New(errors.InvalidParameter, op, "public id must be empty") + return nil, errors.New(ctx, errors.InvalidParameter, op, "public id must be empty") } if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } if !validLoginName(a.LoginName) { - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("login name must be all-lowercase alphanumeric, period or hyphen. got: %s", a.LoginName)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("login name must be all-lowercase alphanumeric, period or hyphen. got: %s", a.LoginName)) } cc, err := r.currentConfig(ctx, a.AuthMethodId) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("retrieve current configuration")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("retrieve current configuration")) } if cc.MinLoginNameLength > len(a.LoginName) { - return nil, errors.New(errors.TooShort, op, fmt.Sprintf("username: %s, must be longer than %d", a.LoginName, cc.MinLoginNameLength)) + return nil, errors.New(ctx, errors.TooShort, op, fmt.Sprintf("username: %s, must be longer than %d", a.LoginName, cc.MinLoginNameLength)) } opts := getOpts(opt...) @@ -62,13 +62,13 @@ func (r *Repository) CreateAccount(ctx context.Context, scopeId string, a *Accou a = a.clone() if opts.withPublicId != "" { if !strings.HasPrefix(opts.withPublicId, intglobals.NewPasswordAccountPrefix+"_") { - return nil, errors.New(errors.InvalidParameter, op, "chosen account id does not have a valid prefix") + return nil, errors.New(ctx, errors.InvalidParameter, op, "chosen account id does not have a valid prefix") } a.PublicId = opts.withPublicId } else { id, err := newAccountId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } a.PublicId = id } @@ -76,20 +76,20 @@ func (r *Repository) CreateAccount(ctx context.Context, scopeId string, a *Accou var cred *Argon2Credential if opts.withPassword { if cc.MinPasswordLength > len(opts.password) { - return nil, errors.New(errors.PasswordTooShort, op, fmt.Sprintf("must be longer than %v", cc.MinPasswordLength)) + return nil, errors.New(ctx, errors.PasswordTooShort, op, fmt.Sprintf("must be longer than %v", cc.MinPasswordLength)) } if cred, err = newArgon2Credential(a.PublicId, opts.password, cc.argon2()); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } } oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper"), errors.WithCode(errors.Encrypt)) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper"), errors.WithCode(errors.Encrypt)) } databaseWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeDatabase) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get database wrapper"), errors.WithCode(errors.Encrypt)) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get database wrapper"), errors.WithCode(errors.Encrypt)) } var newCred *Argon2Credential @@ -98,16 +98,16 @@ func (r *Repository) CreateAccount(ctx context.Context, scopeId string, a *Accou func(_ db.Reader, w db.Writer) error { newAccount = a.clone() if err := w.Create(ctx, newAccount, db.WithOplog(oplogWrapper, a.oplog(oplog.OpType_OP_TYPE_CREATE))); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if cred != nil { newCred = cred.clone() if err := newCred.encrypt(ctx, databaseWrapper); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if err := w.Create(ctx, newCred, db.WithOplog(oplogWrapper, cred.oplog(oplog.OpType_OP_TYPE_CREATE))); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } } return nil @@ -116,10 +116,10 @@ func (r *Repository) CreateAccount(ctx context.Context, scopeId string, a *Accou if err != nil { if errors.IsUniqueError(err) { - return nil, errors.New(errors.NotUnique, op, fmt.Sprintf("in auth method %s: name %q or loginName %q already exists", + return nil, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("in auth method %s: name %q or loginName %q already exists", a.AuthMethodId, a.Name, a.LoginName)) } - return nil, errors.Wrap(err, op, errors.WithMsg(a.AuthMethodId)) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(a.AuthMethodId)) } return newAccount, nil } @@ -129,7 +129,7 @@ func (r *Repository) CreateAccount(ctx context.Context, scopeId string, a *Accou func (r *Repository) LookupAccount(ctx context.Context, withPublicId string, opt ...Option) (*Account, error) { const op = "password.(Repository).LookupAccount" if withPublicId == "" { - return nil, errors.New(errors.InvalidPublicId, op, "missing public id") + return nil, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } a := allocAccount() a.PublicId = withPublicId @@ -137,7 +137,7 @@ func (r *Repository) LookupAccount(ctx context.Context, withPublicId string, opt if errors.IsNotFoundError(err) { return nil, nil } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", withPublicId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", withPublicId))) } return a, nil } @@ -146,7 +146,7 @@ func (r *Repository) LookupAccount(ctx context.Context, withPublicId string, opt func (r *Repository) ListAccounts(ctx context.Context, withAuthMethodId string, opt ...Option) ([]*Account, error) { const op = "password.(Repository).ListAccounts" if withAuthMethodId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing auth method id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing auth method id") } opts := getOpts(opt...) limit := r.defaultLimit @@ -157,7 +157,7 @@ func (r *Repository) ListAccounts(ctx context.Context, withAuthMethodId string, var accts []*Account err := r.reader.SearchWhere(ctx, &accts, "auth_method_id = ?", []interface{}{withAuthMethodId}, db.WithLimit(limit)) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return accts, nil } @@ -167,17 +167,17 @@ func (r *Repository) ListAccounts(ctx context.Context, withAuthMethodId string, func (r *Repository) DeleteAccount(ctx context.Context, scopeId, withPublicId string, opt ...Option) (int, error) { const op = "password.(Repository).DeleteAccount" if withPublicId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidPublicId, op, "missing public id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } if scopeId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing scope id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } ac := allocAccount() ac.PublicId = withPublicId oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get oplog wrapper")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get oplog wrapper")) } var rowsDeleted int @@ -190,17 +190,17 @@ func (r *Repository) DeleteAccount(ctx context.Context, scopeId, withPublicId st dAc := ac.clone() rowsDeleted, err = w.Delete(ctx, dAc, db.WithOplog(oplogWrapper, metadata)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(withPublicId)) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(withPublicId)) } return rowsDeleted, nil @@ -231,19 +231,19 @@ func validLoginName(u string) bool { func (r *Repository) UpdateAccount(ctx context.Context, scopeId string, a *Account, version uint32, fieldMaskPaths []string, opt ...Option) (*Account, int, error) { const op = "password.(Repository).UpdateAccount" if a == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing Account") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing Account") } if a.Account == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing embedded Account") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing embedded Account") } if a.PublicId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidPublicId, op, "missing public id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } if version == 0 { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing version") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing version") } if scopeId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } var changeLoginName bool @@ -253,12 +253,12 @@ func (r *Repository) UpdateAccount(ctx context.Context, scopeId string, a *Accou case strings.EqualFold("Description", f): case strings.EqualFold("LoginName", f): if !validLoginName(a.LoginName) { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("invalid username: must be all-lowercase alphanumeric, period or hyphen, got %s", a.LoginName)) } changeLoginName = true default: - return nil, db.NoRowsAffected, errors.New(errors.InvalidFieldMask, op, f) + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidFieldMask, op, f) } } var dbMask, nullFields []string @@ -272,23 +272,23 @@ func (r *Repository) UpdateAccount(ctx context.Context, scopeId string, a *Accou nil, ) if len(dbMask) == 0 && len(nullFields) == 0 { - return nil, db.NoRowsAffected, errors.New(errors.EmptyFieldMask, op, "missing field mask") + return nil, db.NoRowsAffected, errors.New(ctx, errors.EmptyFieldMask, op, "missing field mask") } if changeLoginName { cc, err := r.currentConfigForAccount(ctx, a.PublicId) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("retrieve current configuration")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("retrieve current configuration")) } if cc.MinLoginNameLength > len(a.LoginName) { - return nil, db.NoRowsAffected, errors.New(errors.TooShort, op, + return nil, db.NoRowsAffected, errors.New(ctx, errors.TooShort, op, fmt.Sprintf("username: %s, must be longer than %v", a.LoginName, cc.MinLoginNameLength)) } } oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg(("unable to get oplog wrapper"))) } @@ -304,10 +304,10 @@ func (r *Repository) UpdateAccount(ctx context.Context, scopeId string, a *Accou var err error rowsUpdated, err = w.Update(ctx, returnedAccount, dbMask, nullFields, db.WithOplog(oplogWrapper, metadata), db.WithVersion(&version)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsUpdated > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been updated") } return nil }, @@ -315,10 +315,10 @@ func (r *Repository) UpdateAccount(ctx context.Context, scopeId string, a *Accou if err != nil { if errors.IsUniqueError(err) { - return nil, db.NoRowsAffected, errors.New(errors.NotUnique, op, + return nil, db.NoRowsAffected, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("name %s already exists: %s", a.Name, a.PublicId)) } - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(a.PublicId)) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(a.PublicId)) } return returnedAccount, rowsUpdated, nil diff --git a/internal/auth/password/repository_authmethod.go b/internal/auth/password/repository_authmethod.go index 07792bdb2..2433f2b29 100644 --- a/internal/auth/password/repository_authmethod.go +++ b/internal/auth/password/repository_authmethod.go @@ -25,16 +25,16 @@ import ( func (r *Repository) CreateAuthMethod(ctx context.Context, m *AuthMethod, opt ...Option) (*AuthMethod, error) { const op = "password.(Repository).CreateAuthMethod" if m == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing AuthMethod") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing AuthMethod") } if m.AuthMethod == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing embedded AuthMethod") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing embedded AuthMethod") } if m.ScopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } if m.PublicId != "" { - return nil, errors.New(errors.InvalidParameter, op, "public id not empty") + return nil, errors.New(ctx, errors.InvalidParameter, op, "public id not empty") } m = m.Clone() @@ -42,35 +42,35 @@ func (r *Repository) CreateAuthMethod(ctx context.Context, m *AuthMethod, opt .. if opts.withPublicId != "" { if !strings.HasPrefix(opts.withPublicId, AuthMethodPrefix+"_") { - return nil, errors.New(errors.InvalidPublicId, op, fmt.Sprintf("passed-in public ID %q has wrong prefix, should be %q", opts.withPublicId, AuthMethodPrefix)) + return nil, errors.New(ctx, errors.InvalidPublicId, op, fmt.Sprintf("passed-in public ID %q has wrong prefix, should be %q", opts.withPublicId, AuthMethodPrefix)) } m.PublicId = opts.withPublicId } else { id, err := newAuthMethodId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } m.PublicId = id } c, ok := opts.withConfig.(*Argon2Configuration) if !ok { - return nil, errors.New(errors.PasswordUnsupportedConfiguration, op, "unknown configuration") + return nil, errors.New(ctx, errors.PasswordUnsupportedConfiguration, op, "unknown configuration") } if err := c.validate(); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } var err error c.PrivateId, err = newArgon2ConfigurationId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } m.PasswordConfId, c.PasswordMethodId = c.PrivateId, m.PublicId oplogWrapper, err := r.kms.GetWrapper(ctx, m.GetScopeId(), kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get oplog wrapper")) } var newAuthMethod *AuthMethod @@ -79,11 +79,11 @@ func (r *Repository) CreateAuthMethod(ctx context.Context, m *AuthMethod, opt .. func(_ db.Reader, w db.Writer) error { newArgon2Conf = c.clone() if err := w.Create(ctx, newArgon2Conf, db.WithOplog(oplogWrapper, c.oplog(oplog.OpType_OP_TYPE_CREATE))); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to create argon conf")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to create argon conf")) } newAuthMethod = m.Clone() if err := w.Create(ctx, newAuthMethod, db.WithOplog(oplogWrapper, m.oplog(oplog.OpType_OP_TYPE_CREATE))); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to create auth method")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to create auth method")) } return nil }, @@ -91,9 +91,9 @@ func (r *Repository) CreateAuthMethod(ctx context.Context, m *AuthMethod, opt .. if err != nil { if errors.IsUniqueError(err) { - return nil, errors.New(errors.NotUnique, op, fmt.Sprintf("in scope: %s: name %s already exists", m.ScopeId, m.Name)) + return nil, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("in scope: %s: name %s already exists", m.ScopeId, m.Name)) } - return nil, errors.Wrap(err, op, errors.WithMsg(m.ScopeId)) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(m.ScopeId)) } return newAuthMethod, nil } @@ -103,7 +103,7 @@ func (r *Repository) CreateAuthMethod(ctx context.Context, m *AuthMethod, opt .. func (r *Repository) LookupAuthMethod(ctx context.Context, publicId string, _ ...Option) (*AuthMethod, error) { const op = "password.(Repository).LookupAuthMethod" if publicId == "" { - return nil, errors.New(errors.InvalidPublicId, op, "missing public id") + return nil, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } return r.lookupAuthMethod(ctx, publicId) } @@ -113,11 +113,11 @@ func (r *Repository) LookupAuthMethod(ctx context.Context, publicId string, _ .. func (r *Repository) ListAuthMethods(ctx context.Context, scopeIds []string, opt ...Option) ([]*AuthMethod, error) { const op = "password.(Repository).ListAuthMethods" if len(scopeIds) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } authMethods, err := r.getAuthMethods(ctx, "", scopeIds, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return authMethods, nil } @@ -127,14 +127,14 @@ func (r *Repository) ListAuthMethods(ctx context.Context, scopeIds []string, opt func (r *Repository) DeleteAuthMethod(ctx context.Context, scopeId, publicId string, opt ...Option) (int, error) { const op = "password.(Repository).DeleteAuthMethod" if publicId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidPublicId, op, "missing public id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } am := allocAuthMethod() am.PublicId = publicId oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get oplog wrapper")) } @@ -148,17 +148,17 @@ func (r *Repository) DeleteAuthMethod(ctx context.Context, scopeId, publicId str dAc := am.Clone() rowsDeleted, err = w.Delete(ctx, dAc, db.WithOplog(oplogWrapper, metadata)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(publicId)) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(publicId)) } return rowsDeleted, nil @@ -179,13 +179,13 @@ func (r *Repository) DeleteAuthMethod(ctx context.Context, scopeId, publicId str func (r *Repository) UpdateAuthMethod(ctx context.Context, authMethod *AuthMethod, version uint32, fieldMaskPaths []string, opt ...Option) (*AuthMethod, int, error) { const op = "password.(Repository).UpdateAuthMethod" if authMethod == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing authMethod") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing authMethod") } if authMethod.PublicId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing authMethod public id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing authMethod public id") } if authMethod.ScopeId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } for _, f := range fieldMaskPaths { switch { @@ -194,7 +194,7 @@ func (r *Repository) UpdateAuthMethod(ctx context.Context, authMethod *AuthMetho case strings.EqualFold("MinLoginNameLength", f): case strings.EqualFold("MinPasswordLength", f): default: - return nil, db.NoRowsAffected, errors.New(errors.InvalidFieldMask, op, f) + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidFieldMask, op, f) } } var dbMask, nullFields []string @@ -209,12 +209,12 @@ func (r *Repository) UpdateAuthMethod(ctx context.Context, authMethod *AuthMetho nil, ) if len(dbMask) == 0 && len(nullFields) == 0 { - return nil, db.NoRowsAffected, errors.New(errors.EmptyFieldMask, op, "field mask must not be empty") + return nil, db.NoRowsAffected, errors.New(ctx, errors.EmptyFieldMask, op, "field mask must not be empty") } oplogWrapper, err := r.kms.GetWrapper(ctx, authMethod.ScopeId, kms.KeyPurposeOplog) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get oplog wrapper")) } @@ -238,10 +238,10 @@ func (r *Repository) UpdateAuthMethod(ctx context.Context, authMethod *AuthMetho dbOpts..., ) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsUpdated > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been updated") } // we need a new repo, that's using the same reader/writer as this TxHandler txRepo := &Repository{ @@ -253,19 +253,19 @@ func (r *Repository) UpdateAuthMethod(ctx context.Context, authMethod *AuthMetho } upAuthMethod, err = txRepo.lookupAuthMethod(ctx, upAuthMethod.PublicId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to lookup auth method after update")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to lookup auth method after update")) } if upAuthMethod == nil { - return errors.New(errors.RecordNotFound, op, "unable to lookup auth method after update") + return errors.New(ctx, errors.RecordNotFound, op, "unable to lookup auth method after update") } return nil }, ) if err != nil { if errors.IsUniqueError(err) { - return nil, db.NoRowsAffected, errors.New(errors.NotUnique, op, fmt.Sprintf("authMethod %s already exists in scope %s", authMethod.Name, authMethod.ScopeId)) + return nil, db.NoRowsAffected, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("authMethod %s already exists in scope %s", authMethod.Name, authMethod.ScopeId)) } - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(authMethod.PublicId)) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(authMethod.PublicId)) } return upAuthMethod, rowsUpdated, nil } @@ -276,13 +276,13 @@ func (r *Repository) lookupAuthMethod(ctx context.Context, authMethodId string, var err error ams, err := r.getAuthMethods(ctx, authMethodId, nil, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } switch { case len(ams) == 0: return nil, nil // not an error to return no rows for a "lookup" case len(ams) > 1: - return nil, errors.New(errors.NotSpecificIntegrity, op, fmt.Sprintf("%s matched more than 1 ", authMethodId)) + return nil, errors.New(ctx, errors.NotSpecificIntegrity, op, fmt.Sprintf("%s matched more than 1 ", authMethodId)) default: return ams[0], nil } @@ -300,10 +300,10 @@ func (r *Repository) lookupAuthMethod(ctx context.Context, authMethodId string, func (r *Repository) getAuthMethods(ctx context.Context, authMethodId string, scopeIds []string, opt ...Option) ([]*AuthMethod, error) { const op = "password.(Repository).getAuthMethods" if authMethodId == "" && len(scopeIds) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing search criteria: both auth method id and Scope IDs are empty") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing search criteria: both auth method id and Scope IDs are empty") } if authMethodId != "" && len(scopeIds) > 0 { - return nil, errors.New(errors.InvalidParameter, op, "searching for both an auth method id and Scope IDs is not supported") + return nil, errors.New(ctx, errors.InvalidParameter, op, "searching for both an auth method id and Scope IDs is not supported") } dbArgs := []db.Option{} @@ -335,7 +335,7 @@ func (r *Repository) getAuthMethods(ctx context.Context, authMethodId string, sc var views []*authMethodView err := r.reader.SearchWhere(ctx, &views, strings.Join(where, " and "), args, dbArgs...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if len(views) == 0 { // we're done if nothing is found. diff --git a/internal/auth/password/repository_configuration.go b/internal/auth/password/repository_configuration.go index 15e1b27e8..8f79deed5 100644 --- a/internal/auth/password/repository_configuration.go +++ b/internal/auth/password/repository_configuration.go @@ -22,11 +22,11 @@ type Configuration interface { func (r *Repository) GetConfiguration(ctx context.Context, authMethodId string) (Configuration, error) { const op = "password.(Repository).GetConfiguration" if authMethodId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing auth method id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing auth method id") } cc, err := r.currentConfig(ctx, authMethodId) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return cc.argon2(), nil } @@ -44,24 +44,24 @@ func (r *Repository) GetConfiguration(ctx context.Context, authMethodId string) func (r *Repository) SetConfiguration(ctx context.Context, scopeId string, c Configuration) (Configuration, error) { const op = "password.(Repository).SetConfiguration" if c == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing configuration") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing configuration") } if c.AuthMethodId() == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing auth method id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing auth method id") } if err := c.validate(); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } switch v := c.(type) { case *Argon2Configuration: out, err := r.setArgon2Conf(ctx, scopeId, v) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return out, nil default: - return nil, errors.New(errors.PasswordUnsupportedConfiguration, op, "unknown configuration") + return nil, errors.New(ctx, errors.PasswordUnsupportedConfiguration, op, "unknown configuration") } } @@ -71,7 +71,7 @@ func (r *Repository) setArgon2Conf(ctx context.Context, scopeId string, c *Argon id, err := newArgon2ConfigurationId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } c.PrivateId = id @@ -83,7 +83,7 @@ func (r *Repository) setArgon2Conf(ctx context.Context, scopeId string, c *Argon oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get oplog wrapper")) } newArgon2Conf := &Argon2Configuration{Argon2Configuration: &store.Argon2Configuration{}} @@ -93,27 +93,27 @@ func (r *Repository) setArgon2Conf(ctx context.Context, scopeId string, c *Argon where, args := c.whereDup() if err := rr.LookupWhere(ctx, newArgon2Conf, where, args...); err != nil { if !errors.IsNotFoundError(err) { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } newArgon2Conf = c.clone() if err := w.Create(ctx, newArgon2Conf, db.WithOplog(oplogWrapper, c.oplog(oplog.OpType_OP_TYPE_CREATE))); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } } a.PasswordConfId = newArgon2Conf.PrivateId rowsUpdated, err := w.Update(ctx, a, []string{"PasswordConfId"}, nil, db.WithOplog(oplogWrapper, a.oplog(oplog.OpType_OP_TYPE_UPDATE))) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsUpdated > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been updated") } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return newArgon2Conf, nil } @@ -134,7 +134,7 @@ func (r *Repository) currentConfig(ctx context.Context, authMethodId string) (*c const op = "password.(Repository).currentConfig" var cc currentConfig if err := r.reader.LookupWhere(ctx, &cc, "password_method_id = ?", authMethodId); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return &cc, nil } @@ -145,13 +145,13 @@ func (r *Repository) currentConfigForAccount(ctx context.Context, accountId stri rows, err := r.reader.Query(ctx, currentConfigForAccountQuery, []interface{}{accountId}) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } defer rows.Close() for rows.Next() { var conf currentConfig if err := r.reader.ScanRows(rows, &conf); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } confs = append(confs, conf) } @@ -162,7 +162,7 @@ func (r *Repository) currentConfigForAccount(ctx context.Context, accountId stri return nil, nil case len(confs) > 1: // this should never happen - return nil, errors.New(errors.Unknown, op, "multiple current configs returned for account") + return nil, errors.New(ctx, errors.Unknown, op, "multiple current configs returned for account") default: cc = confs[0] } diff --git a/internal/auth/password/repository_password.go b/internal/auth/password/repository_password.go index 74ec6a6cc..69ecfced0 100644 --- a/internal/auth/password/repository_password.go +++ b/internal/auth/password/repository_password.go @@ -34,26 +34,26 @@ type authAccount struct { func (r *Repository) Authenticate(ctx context.Context, scopeId, authMethodId, loginName, password string) (*Account, error) { const op = "password.(Repository).Authenticate" if authMethodId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing authMethodId") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing authMethodId", errors.WithoutEvent()) } if loginName == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing loginName") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing loginName", errors.WithoutEvent()) } if password == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing password") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing password", errors.WithoutEvent()) } if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing scopeId") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scopeId", errors.WithoutEvent()) } databaseWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeDatabase) if err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get database wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get database wrapper")) } acct, err := r.authenticate(ctx, scopeId, authMethodId, loginName, password) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if acct == nil { return nil, nil @@ -62,22 +62,22 @@ func (r *Repository) Authenticate(ctx context.Context, scopeId, authMethodId, lo if !acct.IsCurrentConf { cc, err := r.currentConfig(ctx, authMethodId) if err != nil { - return acct.Account, errors.Wrap(err, op, errors.WithMsg("retrieve current password configuration")) + return acct.Account, errors.Wrap(ctx, err, op, errors.WithMsg("retrieve current password configuration")) } cred, err := newArgon2Credential(acct.PublicId, password, cc.argon2()) if err != nil { - return acct.Account, errors.Wrap(err, op, errors.WithCode(errors.PasswordInvalidConfiguration)) + return acct.Account, errors.Wrap(ctx, err, op, errors.WithCode(errors.PasswordInvalidConfiguration)) } oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return acct.Account, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get oplong wrapper")) + return acct.Account, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get oplong wrapper")) } // do not change the Credential Id cred.PrivateId = acct.CredentialId if err := cred.encrypt(ctx, databaseWrapper); err != nil { - return acct.Account, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("update credential")) + return acct.Account, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("update credential")) } fields := []string{"CtSalt", "DerivedKey", "PasswordConfId"} @@ -87,16 +87,16 @@ func (r *Repository) Authenticate(ctx context.Context, scopeId, authMethodId, lo func(_ db.Reader, w db.Writer) error { rowsUpdated, err := w.Update(ctx, cred, fields, nil, db.WithOplog(oplogWrapper, metadata)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsUpdated > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been updated") } return nil }, ) if err != nil { - return acct.Account, errors.Wrap(err, op, errors.WithMsg("update credential")) + return acct.Account, errors.Wrap(ctx, err, op, errors.WithMsg("update credential")) } } return acct.Account, nil @@ -112,44 +112,44 @@ func (r *Repository) Authenticate(ctx context.Context, scopeId, authMethodId, lo func (r *Repository) ChangePassword(ctx context.Context, scopeId, accountId, old, new string, version uint32) (*Account, error) { const op = "password.(Repository).ChangePassword" if accountId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing account id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing account id") } if old == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing old password") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing old password") } if new == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing new password") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing new password") } if old == new { - return nil, errors.New(errors.PasswordsEqual, op, "passwords must not equal") + return nil, errors.New(ctx, errors.PasswordsEqual, op, "passwords must not equal") } if version == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing version") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing version") } if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing scopeId") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scopeId") } authAccount, err := r.LookupAccount(ctx, accountId) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if authAccount == nil { - return nil, errors.New(errors.RecordNotFound, op, "account not found") + return nil, errors.New(ctx, errors.RecordNotFound, op, "account not found") } oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get oplog wrapper")) } databaseWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeDatabase) if err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get database wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get database wrapper")) } acct, err := r.authenticate(ctx, scopeId, authAccount.GetAuthMethodId(), authAccount.GetLoginName(), old) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if acct == nil { return nil, nil @@ -157,18 +157,18 @@ func (r *Repository) ChangePassword(ctx context.Context, scopeId, accountId, old cc, err := r.currentConfig(ctx, authAccount.GetAuthMethodId()) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("retrieve current password configuration")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("retrieve current password configuration")) } if cc.MinPasswordLength > len(new) { - return nil, errors.New(errors.PasswordTooShort, op, fmt.Sprintf("must be at least %d", cc.MinPasswordLength)) + return nil, errors.New(ctx, errors.PasswordTooShort, op, fmt.Sprintf("must be at least %d", cc.MinPasswordLength)) } newCred, err := newArgon2Credential(accountId, new, cc.argon2()) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if err := newCred.encrypt(ctx, databaseWrapper); err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.Encrypt)) + return nil, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt)) } oldCred := acct.Argon2Credential @@ -181,27 +181,27 @@ func (r *Repository) ChangePassword(ctx context.Context, scopeId, accountId, old updatedAccount.Version = version + 1 rowsUpdated, err := w.Update(ctx, updatedAccount, []string{"Version"}, nil, db.WithOplog(oplogWrapper, acct.Account.oplog(oplog.OpType_OP_TYPE_UPDATE)), db.WithVersion(&version)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update account version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update account version")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated account and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated account and %d rows updated", rowsUpdated)) } rowsDeleted, err := w.Delete(ctx, oldCred, db.WithOplog(oplogWrapper, oldCred.oplog(oplog.OpType_OP_TYPE_DELETE))) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } if err = w.Create(ctx, newCred, db.WithOplog(oplogWrapper, newCred.oplog(oplog.OpType_OP_TYPE_CREATE))); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to create new credential")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to create new credential")) } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } // change the Credential Id @@ -215,13 +215,13 @@ func (r *Repository) authenticate(ctx context.Context, scopeId, authMethodId, lo rows, err := r.reader.Query(ctx, authenticateQuery, []interface{}{authMethodId, loginName}) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } defer rows.Close() for rows.Next() { var aa authAccount if err := r.reader.ScanRows(rows, &aa); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } accts = append(accts, aa) } @@ -232,7 +232,7 @@ func (r *Repository) authenticate(ctx context.Context, scopeId, authMethodId, lo return nil, nil case len(accts) > 1: // this should never happen - return nil, errors.New(errors.Unknown, op, "multiple accounts returned for user name") + return nil, errors.New(ctx, errors.Unknown, op, "multiple accounts returned for user name") default: acct = accts[0] } @@ -240,11 +240,11 @@ func (r *Repository) authenticate(ctx context.Context, scopeId, authMethodId, lo // We don't pass a wrapper in here because for ecryption we want to indicate the expected key ID databaseWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeDatabase, kms.WithKeyId(acct.GetKeyId())) if err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get database wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get database wrapper")) } if err := acct.decrypt(ctx, databaseWrapper); err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.Decrypt), errors.WithMsg("unable to decrypt credential")) + return nil, errors.Wrap(ctx, err, op, errors.WithCode(errors.Decrypt), errors.WithMsg("unable to decrypt credential")) } inputKey := argon2.IDKey([]byte(password), acct.Salt, acct.Iterations, acct.Memory, uint8(acct.Threads), acct.KeyLength) @@ -260,42 +260,42 @@ func (r *Repository) authenticate(ctx context.Context, scopeId, authMethodId, lo func (r *Repository) SetPassword(ctx context.Context, scopeId, accountId, password string, version uint32) (*Account, error) { const op = "password.(Repository).SetPassword" if accountId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing accountId") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing accountId") } if version == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing version") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing version") } if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing scopeId") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scopeId") } oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get oplog wrapper")) } databaseWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeDatabase) if err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get database wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get database wrapper")) } var newCred *Argon2Credential if password != "" { cc, err := r.currentConfigForAccount(ctx, accountId) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if cc == nil { - return nil, errors.New(errors.RecordNotFound, op, "unable to retrieve current configuration") + return nil, errors.New(ctx, errors.RecordNotFound, op, "unable to retrieve current configuration") } if cc.MinPasswordLength > len(password) { - return nil, errors.New(errors.PasswordTooShort, op, fmt.Sprintf("password must be at least %v", cc.MinPasswordLength)) + return nil, errors.New(ctx, errors.PasswordTooShort, op, fmt.Sprintf("password must be at least %v", cc.MinPasswordLength)) } newCred, err = newArgon2Credential(accountId, password, cc.argon2()) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if err := newCred.encrypt(ctx, databaseWrapper); err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.Encrypt)) + return nil, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt)) } } @@ -307,27 +307,27 @@ func (r *Repository) SetPassword(ctx context.Context, scopeId, accountId, passwo updatedAccount.Version = version + 1 rowsUpdated, err := w.Update(ctx, updatedAccount, []string{"Version"}, nil, db.WithOplog(oplogWrapper, updatedAccount.oplog(oplog.OpType_OP_TYPE_UPDATE)), db.WithVersion(&version)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update account version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update account version")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated account and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated account and %d rows updated", rowsUpdated)) } acct = updatedAccount oldCred := allocCredential() if err := rr.LookupWhere(ctx, &oldCred, "password_account_id = ?", accountId); err != nil { if !errors.IsNotFoundError(err) { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } } if oldCred.PrivateId != "" { dCred := oldCred.clone() rowsDeleted, err := w.Delete(ctx, dCred, db.WithOplog(oplogWrapper, oldCred.oplog(oplog.OpType_OP_TYPE_DELETE))) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } } if newCred != nil { @@ -337,7 +337,7 @@ func (r *Repository) SetPassword(ctx context.Context, scopeId, accountId, passwo }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return acct, nil } diff --git a/internal/authtoken/authtoken.go b/internal/authtoken/authtoken.go index ae2627fac..cfe8a8285 100644 --- a/internal/authtoken/authtoken.go +++ b/internal/authtoken/authtoken.go @@ -74,7 +74,7 @@ func (at *AuthToken) encrypt(ctx context.Context, cipher wrapping.Wrapper) error const op = "authtoken.(writableAuthToken).encrypt" // structwrapping doesn't support embedding, so we'll pass in the store.Entry directly if err := structwrapping.WrapStruct(ctx, cipher, at.AuthToken, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Encrypt)) + return errors.WrapDeprecated(err, op, errors.WithCode(errors.Encrypt)) } at.KeyId = cipher.KeyID() return nil @@ -85,7 +85,7 @@ func (at *AuthToken) decrypt(ctx context.Context, cipher wrapping.Wrapper) error const op = "authtoken.(AuthToken).decrypt" // structwrapping doesn't support embedding, so we'll pass in the store.Entry directly if err := structwrapping.UnwrapStruct(ctx, cipher, at.AuthToken, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decrypt)) + return errors.WrapDeprecated(err, op, errors.WithCode(errors.Decrypt)) } return nil } @@ -102,7 +102,7 @@ func NewAuthTokenId() (string, error) { const op = "authtoken.newAuthTokenId" id, err := db.NewPublicId(AuthTokenPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } @@ -113,7 +113,7 @@ func newAuthToken(opt ...Option) (*AuthToken, error) { const op = "authtoken.newAuthToken" token, err := base62.Random(tokenLength) if err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.Io)) + return nil, errors.WrapDeprecated(err, op, errors.WithCode(errors.Io)) } opts := getOpts(opt...) @@ -139,22 +139,22 @@ func EncryptToken(ctx context.Context, kmsCache *kms.Kms, scopeId, publicId, tok marshaledS1Info, err := proto.Marshal(s1Info) if err != nil { - return "", errors.Wrap(err, op, errors.WithMsg("marshaling encrypted token"), errors.WithCode(errors.Encode)) + return "", errors.WrapDeprecated(err, op, errors.WithMsg("marshaling encrypted token"), errors.WithCode(errors.Encode)) } tokenWrapper, err := kmsCache.GetWrapper(ctx, scopeId, kms.KeyPurposeTokens) if err != nil { - return "", errors.Wrap(err, op, errors.WithMsg("unable to get wrapper")) + return "", errors.WrapDeprecated(err, op, errors.WithMsg("unable to get wrapper")) } blobInfo, err := tokenWrapper.Encrypt(ctx, []byte(marshaledS1Info), []byte(publicId)) if err != nil { - return "", errors.Wrap(err, op, errors.WithMsg("marshaling token info"), errors.WithCode(errors.Encrypt)) + return "", errors.WrapDeprecated(err, op, errors.WithMsg("marshaling token info"), errors.WithCode(errors.Encrypt)) } marshaledBlob, err := proto.Marshal(blobInfo) if err != nil { - return "", errors.Wrap(err, op, errors.WithMsg("marshaling encrypted token"), errors.WithCode(errors.Encode)) + return "", errors.WrapDeprecated(err, op, errors.WithMsg("marshaling encrypted token"), errors.WithCode(errors.Encode)) } encoded := base58.FastBase58Encoding(marshaledBlob) diff --git a/internal/authtoken/repository.go b/internal/authtoken/repository.go index 776e101a0..3853d1901 100644 --- a/internal/authtoken/repository.go +++ b/internal/authtoken/repository.go @@ -35,11 +35,11 @@ func NewRepository(r db.Reader, w db.Writer, kms *kms.Kms, opt ...Option) (*Repo const op = "authtoken.NewRepository" switch { case r == nil: - return nil, errors.New(errors.InvalidParameter, op, "nil db reader") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil db reader") case w == nil: - return nil, errors.New(errors.InvalidParameter, op, "nil db writer") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil db writer") case kms == nil: - return nil, errors.New(errors.InvalidParameter, op, "nil kms") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil kms") } opts := getOpts(opt...) @@ -63,24 +63,24 @@ func NewRepository(r db.Reader, w db.Writer, kms *kms.Kms, opt ...Option) (*Repo func (r *Repository) CreateAuthToken(ctx context.Context, withIamUser *iam.User, withAuthAccountId string, opt ...Option) (*AuthToken, error) { const op = "authtoken.(Repository).CreateAuthToken" if withIamUser == nil || withIamUser.User == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing user") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing user") } if withIamUser.GetPublicId() == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing user id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing user id") } if withAuthAccountId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing auth account id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing auth account id") } at, err := newAuthToken() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } at.AuthAccountId = withAuthAccountId opts := getOpts(opt...) if opts.withPublicId == "" { id, err := NewAuthTokenId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } opts.withPublicId = id } @@ -95,14 +95,14 @@ func (r *Repository) CreateAuthToken(ctx context.Context, withIamUser *iam.User, databaseWrapper, err := r.kms.GetWrapper(ctx, withIamUser.GetScopeId(), kms.KeyPurposeDatabase) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get database wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get database wrapper")) } // We truncate the expiration time to the nearest second to make testing in different platforms with // different time resolutions easier. expiration, err := ptypes.TimestampProto(time.Now().Add(r.timeToLiveDuration).Truncate(time.Second)) if err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.InvalidTimeStamp)) + return nil, errors.Wrap(ctx, err, op, errors.WithCode(errors.InvalidTimeStamp)) } at.ExpirationTime = ×tamp.Timestamp{Timestamp: expiration} @@ -115,10 +115,10 @@ func (r *Repository) CreateAuthToken(ctx context.Context, withIamUser *iam.User, acct := allocAuthAccount() acct.PublicId = withAuthAccountId if err := read.LookupByPublicId(ctx, acct); err != nil { - return errors.Wrap(err, op, errors.WithMsg("auth account lookup")) + return errors.Wrap(ctx, err, op, errors.WithMsg("auth account lookup")) } if acct.GetIamUserId() != withIamUser.GetPublicId() { - return errors.New(errors.InvalidParameter, op, + return errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("auth account %q mismatch with iam user %q", withAuthAccountId, withIamUser.GetPublicId())) } at.ScopeId = acct.GetScopeId() @@ -127,11 +127,11 @@ func (r *Repository) CreateAuthToken(ctx context.Context, withIamUser *iam.User, newAuthToken = at.clone() if err := newAuthToken.encrypt(ctx, databaseWrapper); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } // tokens are not replicated, so they don't need oplog entries. if err := w.Create(ctx, newAuthToken); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } newAuthToken.CtToken = nil @@ -140,7 +140,7 @@ func (r *Repository) CreateAuthToken(ctx context.Context, withIamUser *iam.User, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return newAuthToken, nil } @@ -151,7 +151,7 @@ func (r *Repository) CreateAuthToken(ctx context.Context, withIamUser *iam.User, func (r *Repository) LookupAuthToken(ctx context.Context, id string, opt ...Option) (*AuthToken, error) { const op = "authtoken.(Repository).LookupAuthToken" if id == "" { - return nil, errors.New(errors.InvalidPublicId, op, "missing public id") + return nil, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } opts := getOpts(opt...) @@ -163,17 +163,17 @@ func (r *Repository) LookupAuthToken(ctx context.Context, id string, opt ...Opti if errors.IsNotFoundError(err) { return nil, nil } - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } at := atv.toAuthToken() if opts.withTokenValue { databaseWrapper, err := r.kms.GetWrapper(ctx, at.GetScopeId(), kms.KeyPurposeDatabase, kms.WithKeyId(at.GetKeyId())) if err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get database wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get database wrapper")) } if err := at.decrypt(ctx, databaseWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } } @@ -192,10 +192,10 @@ func (r *Repository) LookupAuthToken(ctx context.Context, id string, opt ...Opti func (r *Repository) ValidateToken(ctx context.Context, id, token string, opt ...Option) (*AuthToken, error) { const op = "authtoken.(Repository).ValidateToken" if token == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing token") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing token") } if id == "" { - return nil, errors.New(errors.InvalidPublicId, op, "missing public id") + return nil, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } retAT, err := r.LookupAuthToken(ctx, id, withTokenValue()) @@ -204,7 +204,7 @@ func (r *Repository) ValidateToken(ctx context.Context, id, token string, opt .. if errors.IsNotFoundError(err) { return nil, nil } - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if retAT == nil { return nil, nil @@ -213,11 +213,11 @@ func (r *Repository) ValidateToken(ctx context.Context, id, token string, opt .. // If the token is too old or stale invalidate it and return nothing. exp, err := ptypes.Timestamp(retAT.GetExpirationTime().GetTimestamp()) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("expiration time"), errors.WithCode(errors.InvalidTimeStamp)) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("expiration time"), errors.WithCode(errors.InvalidTimeStamp)) } lastAccessed, err := ptypes.Timestamp(retAT.GetApproximateLastAccessTime().GetTimestamp()) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("last accessed time"), errors.WithCode(errors.InvalidTimeStamp)) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("last accessed time"), errors.WithCode(errors.InvalidTimeStamp)) } now := time.Now() @@ -234,13 +234,13 @@ func (r *Repository) ValidateToken(ctx context.Context, id, token string, opt .. delAt := retAT.clone() // tokens are not replicated, so they don't need oplog entries. if _, err := w.Delete(ctx, delAt); err != nil { - return errors.Wrap(err, op, errors.WithMsg("delete auth token")) + return errors.Wrap(ctx, err, op, errors.WithMsg("delete auth token")) } retAT = nil return nil }) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return nil, nil } @@ -271,10 +271,10 @@ func (r *Repository) ValidateToken(ctx context.Context, id, token string, opt .. []string{"ApproximateLastAccessTime"}, ) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsUpdated > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been updated") } return nil }, @@ -282,7 +282,7 @@ func (r *Repository) ValidateToken(ctx context.Context, id, token string, opt .. } if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(id)) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(id)) } return retAT, nil } @@ -292,7 +292,7 @@ func (r *Repository) ValidateToken(ctx context.Context, id, token string, opt .. func (r *Repository) ListAuthTokens(ctx context.Context, withScopeIds []string, opt ...Option) ([]*AuthToken, error) { const op = "authtoken.(Repository).ListAuthTokens" if len(withScopeIds) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } opts := getOpts(opt...) @@ -300,7 +300,7 @@ func (r *Repository) ListAuthTokens(ctx context.Context, withScopeIds []string, // to convert them before returning them var atvs []*authTokenView if err := r.reader.SearchWhere(ctx, &atvs, "auth_account_id in (select public_id from auth_account where scope_id in (?))", []interface{}{withScopeIds}, db.WithLimit(opts.withLimit)); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } authTokens := make([]*AuthToken, 0, len(atvs)) for _, atv := range atvs { @@ -317,7 +317,7 @@ func (r *Repository) ListAuthTokens(ctx context.Context, withScopeIds []string, func (r *Repository) DeleteAuthToken(ctx context.Context, id string, opt ...Option) (int, error) { const op = "authtoken.(Repository).DeleteAuthToken" if id == "" { - return db.NoRowsAffected, errors.New(errors.InvalidPublicId, op, "missing public id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } at, err := r.LookupAuthToken(ctx, id) @@ -325,7 +325,7 @@ func (r *Repository) DeleteAuthToken(ctx context.Context, id string, opt ...Opti if errors.IsNotFoundError(err) { return db.NoRowsAffected, nil } - return db.NoRowsAffected, errors.Wrap(err, op) + return db.NoRowsAffected, errors.Wrap(ctx, err, op) } if at == nil { return db.NoRowsAffected, nil @@ -341,17 +341,17 @@ func (r *Repository) DeleteAuthToken(ctx context.Context, id string, opt ...Opti // tokens are not replicated, so they don't need oplog entries. rowsDeleted, err = w.Delete(ctx, deleteAT) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(id)) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(id)) } return rowsDeleted, nil @@ -366,7 +366,7 @@ func (r *Repository) DeleteAuthToken(ctx context.Context, id string, opt ...Opti func (r *Repository) IssueAuthToken(ctx context.Context, tokenRequestId string) (*AuthToken, error) { const op = "authtoken.(Repository).IssueAuthToken" if tokenRequestId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing token request id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing token request id") } var at *AuthToken @@ -383,16 +383,16 @@ func (r *Repository) IssueAuthToken(ctx context.Context, tokenRequestId string) // trigger to set ApproximateLastAccessTime to the commit timestamp. rowsUpdated, err := w.Update(ctx, at, []string{"Status"}, []string{"ApproximateLastAccessTime"}, db.WithWhere("status = ?", PendingStatus)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsUpdated == 0 { - return errors.New(errors.RecordNotFound, op, "pending auth token not found") + return errors.New(ctx, errors.RecordNotFound, op, "pending auth token not found") } if rowsUpdated > 1 { - return errors.New(errors.Internal, op, fmt.Sprintf("should have updated 1 row and we attempted to update %d rows", rowsUpdated)) + return errors.New(ctx, errors.Internal, op, fmt.Sprintf("should have updated 1 row and we attempted to update %d rows", rowsUpdated)) } if at.Status != string(IssuedStatus) { - return errors.New(errors.Internal, op, "updated auth token status != issued") + return errors.New(ctx, errors.Internal, op, "updated auth token status != issued") } // we need a new repo, that's using the same reader/writer as this TxHandler @@ -403,10 +403,10 @@ func (r *Repository) IssueAuthToken(ctx context.Context, tokenRequestId string) } at, err = txRepo.LookupAuthToken(ctx, at.PublicId, withTokenValue()) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if at == nil { - return errors.New(errors.RecordNotFound, op, "issued auth token not found") + return errors.New(ctx, errors.RecordNotFound, op, "issued auth token not found") } return nil }) @@ -433,7 +433,7 @@ func (r *Repository) CloseExpiredPendingTokens(ctx context.Context) (int, error) var err error tokensClosed, err = w.Exec(ctx, sql, args) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, diff --git a/internal/cmd/base/dev.go b/internal/cmd/base/dev.go index a4553845a..20ddacdf6 100644 --- a/internal/cmd/base/dev.go +++ b/internal/cmd/base/dev.go @@ -348,12 +348,13 @@ func (b *Server) createInitialOidcAuthMethod(ctx context.Context) (*oidc.AuthMet } // Create the auth method - oidcRepo, err := oidc.NewRepository(rw, rw, kmsCache) + oidcRepo, err := oidc.NewRepository(ctx, rw, rw, kmsCache) if err != nil { return nil, fmt.Errorf("error creating oidc repo: %w", err) } authMethod, err := oidc.NewAuthMethod( + ctx, scope.Global.String(), b.DevOidcSetup.clientId, b.DevOidcSetup.clientSecret, @@ -395,6 +396,7 @@ func (b *Server) createInitialOidcAuthMethod(ctx context.Context) (*oidc.AuthMet { createAndLinkAccount := func(loginName, userId, accountId, typ string) error { acct, err := oidc.NewAccount( + ctx, b.DevOidcSetup.authMethod.GetPublicId(), loginName, oidc.WithDescription(fmt.Sprintf("Initial %s OIDC account", typ)), diff --git a/internal/cmd/base/servers.go b/internal/cmd/base/servers.go index 443fc4797..3524e9583 100644 --- a/internal/cmd/base/servers.go +++ b/internal/cmd/base/servers.go @@ -145,18 +145,18 @@ func (b *Server) SetupEventing(logger hclog.Logger, serializationLock *sync.Mute const op = "base.(Server).SetupEventing" if logger == nil { - return berrors.New(berrors.InvalidParameter, op, "missing logger") + return berrors.NewDeprecated(berrors.InvalidParameter, op, "missing logger") } if serializationLock == nil { - return berrors.New(berrors.InvalidParameter, op, "missing serialization lock") + return berrors.NewDeprecated(berrors.InvalidParameter, op, "missing serialization lock") } if serverName == "" { - return berrors.New(berrors.InvalidParameter, op, "missing server name") + return berrors.NewDeprecated(berrors.InvalidParameter, op, "missing server name") } opts := getOpts(opt...) if opts.withEventerConfig != nil { if err := opts.withEventerConfig.Validate(); err != nil { - return berrors.Wrap(err, op, berrors.WithMsg("invalid eventer config")) + return berrors.WrapDeprecated(err, op, berrors.WithMsg("invalid eventer config")) } } if opts.withEventerConfig == nil { @@ -165,7 +165,7 @@ func (b *Server) SetupEventing(logger hclog.Logger, serializationLock *sync.Mute if opts.withEventFlags != nil { if err := opts.withEventFlags.Validate(); err != nil { - return berrors.Wrap(err, op, berrors.WithMsg("invalid event flags")) + return berrors.WrapDeprecated(err, op, berrors.WithMsg("invalid event flags")) } if opts.withEventFlags.Format != "" { for i := 0; i < len(opts.withEventerConfig.Sinks); i++ { @@ -195,12 +195,12 @@ func (b *Server) SetupEventing(logger hclog.Logger, serializationLock *sync.Mute e, err := event.NewEventer(logger, serializationLock, serverName, *opts.withEventerConfig) if err != nil { - return berrors.Wrap(err, op, berrors.WithMsg("unable to create eventer")) + return berrors.WrapDeprecated(err, op, berrors.WithMsg("unable to create eventer")) } b.Eventer = e if err := event.InitSysEventer(logger, serializationLock, serverName, event.WithEventer(e)); err != nil { - return berrors.Wrap(err, op, berrors.WithMsg("unable to initialize system eventer")) + return berrors.WrapDeprecated(err, op, berrors.WithMsg("unable to initialize system eventer")) } return nil @@ -210,11 +210,11 @@ func (b *Server) SetupEventing(logger hclog.Logger, serializationLock *sync.Mute func (b *Server) AddEventerToContext(ctx context.Context) (context.Context, error) { const op = "base.(Server).AddEventerToContext" if b.Eventer == nil { - return nil, berrors.New(berrors.InvalidParameter, op, "missing server eventer") + return nil, berrors.NewDeprecated(berrors.InvalidParameter, op, "missing server eventer") } e, err := event.NewEventerContext(ctx, b.Eventer) if err != nil { - return nil, berrors.Wrap(err, op, berrors.WithMsg("unable to add eventer to context")) + return nil, berrors.WrapDeprecated(err, op, berrors.WithMsg("unable to add eventer to context")) } return e, nil } diff --git a/internal/cmd/commands/database/init.go b/internal/cmd/commands/database/init.go index ffe1ce407..ac5799355 100644 --- a/internal/cmd/commands/database/init.go +++ b/internal/cmd/commands/database/init.go @@ -500,7 +500,7 @@ func (c *InitCommand) verifyOplogIsEmpty() error { var empty bool r.Scan(&empty) if !empty { - return errors.New(errors.MigrationIntegrity, op, "oplog_entry is not empty") + return errors.NewDeprecated(errors.MigrationIntegrity, op, "oplog_entry is not empty") } return nil } diff --git a/internal/cmd/commands/dev/dev.go b/internal/cmd/commands/dev/dev.go index c373849bf..edbb3d411 100644 --- a/internal/cmd/commands/dev/dev.go +++ b/internal/cmd/commands/dev/dev.go @@ -321,6 +321,7 @@ func (c *Command) AutocompleteFlags() complete.Flags { func (c *Command) Run(args []string) int { const op = "dev.(Command).Run" + ctx := context.TODO() c.CombineLogs = c.flagCombineLogs var err error @@ -579,7 +580,7 @@ func (c *Command) Run(args []string) int { } var err error - c.controller, err = controller.New(conf) + c.controller, err = controller.New(ctx, conf) if err != nil { c.UI.Error(fmt.Errorf("Error initializing controller: %w", err).Error()) return base.CommandCliError diff --git a/internal/cmd/commands/server/server.go b/internal/cmd/commands/server/server.go index b23205e52..29cf554ca 100644 --- a/internal/cmd/commands/server/server.go +++ b/internal/cmd/commands/server/server.go @@ -133,6 +133,7 @@ func (c *Command) AutocompleteFlags() complete.Flags { } func (c *Command) Run(args []string) int { + ctx := context.TODO() c.CombineLogs = c.flagCombineLogs if result := c.ParseFlagsAndConfig(args); result > 0 { @@ -453,7 +454,7 @@ func (c *Command) Run(args []string) int { c.ReleaseLogGate() if c.Config.Controller != nil { - if err := c.StartController(); err != nil { + if err := c.StartController(ctx); err != nil { c.UI.Error(err.Error()) return base.CommandCliError } @@ -536,14 +537,14 @@ func (c *Command) ParseFlagsAndConfig(args []string) int { return base.CommandSuccess } -func (c *Command) StartController() error { +func (c *Command) StartController(ctx context.Context) error { conf := &controller.Config{ RawConfig: c.Config, Server: c.Server, } var err error - c.controller, err = controller.New(conf) + c.controller, err = controller.New(ctx, conf) if err != nil { return fmt.Errorf("Error initializing controller: %w", err) } @@ -735,5 +736,5 @@ func (c *Command) verifyKmsSetup() error { return nil } } - return errors.New(errors.MigrationIntegrity, op, "can't find global scoped root key") + return errors.NewDeprecated(errors.MigrationIntegrity, op, "can't find global scoped root key") } diff --git a/internal/credential/vault/client_certificate.go b/internal/credential/vault/client_certificate.go index 7a4852111..82f83e515 100644 --- a/internal/credential/vault/client_certificate.go +++ b/internal/credential/vault/client_certificate.go @@ -27,7 +27,7 @@ type ClientCertificate struct { func NewClientCertificate(certificate []byte, key KeySecret) (*ClientCertificate, error) { const op = "vault.NewClientCertificate" if len(certificate) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "no certificate") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "no certificate") } certificateCopy := make([]byte, len(certificate)) @@ -77,14 +77,14 @@ func (c *ClientCertificate) SetTableName(n string) { func (c *ClientCertificate) encrypt(ctx context.Context, cipher wrapping.Wrapper) error { const op = "vault.(ClientCertificate).encrypt" if len(c.CertificateKey) == 0 { - errors.New(errors.InvalidParameter, op, "no certificate key defined") + errors.New(ctx, errors.InvalidParameter, op, "no certificate key defined") } if err := structwrapping.WrapStruct(ctx, cipher, c.ClientCertificate, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Encrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt)) } c.KeyId = cipher.KeyID() if err := c.hmacCertificateKey(ctx, cipher); err != nil { - errors.Wrap(err, op) + errors.Wrap(ctx, err, op) } return nil } @@ -92,7 +92,7 @@ func (c *ClientCertificate) encrypt(ctx context.Context, cipher wrapping.Wrapper func (c *ClientCertificate) decrypt(ctx context.Context, cipher wrapping.Wrapper) error { const op = "vault.(ClientCertificate).decrypt" if err := structwrapping.UnwrapStruct(ctx, cipher, c.ClientCertificate, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Decrypt)) } return nil } @@ -100,15 +100,15 @@ func (c *ClientCertificate) decrypt(ctx context.Context, cipher wrapping.Wrapper func (c *ClientCertificate) hmacCertificateKey(ctx context.Context, cipher wrapping.Wrapper) error { const op = "vault.(ClientCertificate).hmacCertificateKey" if cipher == nil { - return errors.New(errors.InvalidParameter, op, "missing cipher") + return errors.New(ctx, errors.InvalidParameter, op, "missing cipher") } reader, err := kms.NewDerivedReader(cipher, 32, []byte(c.StoreId), nil) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } key, _, err := ed25519.GenerateKey(reader) if err != nil { - return errors.New(errors.Encrypt, op, "unable to generate derived key") + return errors.New(ctx, errors.Encrypt, op, "unable to generate derived key") } mac := hmac.New(sha256.New, key) _, _ = mac.Write(c.CertificateKey) diff --git a/internal/credential/vault/credential.go b/internal/credential/vault/credential.go index a3a9c02ed..4d4f4b707 100644 --- a/internal/credential/vault/credential.go +++ b/internal/credential/vault/credential.go @@ -48,13 +48,13 @@ type Credential struct { func newCredential(libraryId, sessionId, externalId string, tokenHmac []byte, expiration time.Duration) (*Credential, error) { const op = "vault.newCredential" if libraryId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no library id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "no library id") } if sessionId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no session id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "no session id") } if len(tokenHmac) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "no tokenHmac") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "no tokenHmac") } status := string(ActiveCredential) diff --git a/internal/credential/vault/credential_store.go b/internal/credential/vault/credential_store.go index 34d21a9c5..3809cce21 100644 --- a/internal/credential/vault/credential_store.go +++ b/internal/credential/vault/credential_store.go @@ -182,7 +182,7 @@ func (cs *CredentialStore) client() (*client, error) { c, err := newClient(clientConfig) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.WrapDeprecated(err, op) } return c, nil } diff --git a/internal/credential/vault/jobs.go b/internal/credential/vault/jobs.go index 0f5ddd862..aead405f7 100644 --- a/internal/credential/vault/jobs.go +++ b/internal/credential/vault/jobs.go @@ -32,45 +32,45 @@ func RegisterJobs(ctx context.Context, scheduler *scheduler.Scheduler, r db.Read const op = "vault.RegisterJobs" tokenRenewal, err := newTokenRenewalJob(r, w, kms, logger) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if err = scheduler.RegisterJob(ctx, tokenRenewal); err != nil { - return errors.Wrap(err, op, errors.WithMsg("token renewal job")) + return errors.Wrap(ctx, err, op, errors.WithMsg("token renewal job")) } tokenRevoke, err := newTokenRevocationJob(r, w, kms, logger) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if err = scheduler.RegisterJob(ctx, tokenRevoke); err != nil { - return errors.Wrap(err, op, errors.WithMsg("token revocation job")) + return errors.Wrap(ctx, err, op, errors.WithMsg("token revocation job")) } credRenewal, err := newCredentialRenewalJob(r, w, kms, logger) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if err = scheduler.RegisterJob(ctx, credRenewal); err != nil { - return errors.Wrap(err, op, errors.WithMsg("credential renewal job")) + return errors.Wrap(ctx, err, op, errors.WithMsg("credential renewal job")) } credRevoke, err := newCredentialRevocationJob(r, w, kms, logger) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if err = scheduler.RegisterJob(ctx, credRevoke); err != nil { - return errors.Wrap(err, op, errors.WithMsg("credential revocation job")) + return errors.Wrap(ctx, err, op, errors.WithMsg("credential revocation job")) } credStoreCleanup, err := newCredentialStoreCleanupJob(r, w, kms, logger) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if err = scheduler.RegisterJob(ctx, credStoreCleanup); err != nil { - return errors.Wrap(err, op, errors.WithMsg("credential store cleanup job")) + return errors.Wrap(ctx, err, op, errors.WithMsg("credential store cleanup job")) } credCleanup, err := newCredentialCleanupJob(w) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if err = scheduler.RegisterJob(ctx, credCleanup); err != nil { - return errors.Wrap(err, op, errors.WithMsg("credential cleanup job")) + return errors.Wrap(ctx, err, op, errors.WithMsg("credential cleanup job")) } return nil } @@ -97,13 +97,13 @@ func newTokenRenewalJob(r db.Reader, w db.Writer, kms *kms.Kms, logger hclog.Log const op = "vault.newTokenRenewalJob" switch { case r == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing db.Reader") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing db.Reader") case w == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing db.Writer") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing db.Writer") case kms == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing kms") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing kms") case logger == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing logger") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing logger") } opts := getOpts(opt...) @@ -135,13 +135,13 @@ func (r *TokenRenewalJob) Status() scheduler.JobStatus { func (r *TokenRenewalJob) Run(ctx context.Context) error { const op = "vault.(TokenRenewalJob).Run" if !r.running.CAS(r.running.Load(), true) { - return errors.New(errors.JobAlreadyRunning, op, "job already running") + return errors.New(ctx, errors.JobAlreadyRunning, op, "job already running") } defer r.running.Store(false) // Verify context is not done before running if err := ctx.Err(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } var ps []*privateStore @@ -150,7 +150,7 @@ func (r *TokenRenewalJob) Run(ctx context.Context) error { // set to renew in sequence. err := r.reader.SearchWhere(ctx, &ps, `token_renewal_time < wt_add_seconds_to_now(?)`, []interface{}{renewalWindow.Seconds()}, db.WithLimit(r.limit)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } // Set numProcessed and numTokens for status report @@ -159,7 +159,7 @@ func (r *TokenRenewalJob) Run(ctx context.Context) error { for _, s := range ps { // Verify context is not done before renewing next token if err := ctx.Err(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if err := r.renewToken(ctx, s); err != nil { event.WriteError(ctx, op, err, event.WithInfoMsg("error renewing token", "credential store id", s.StoreId, "token status", s.TokenStatus)) @@ -174,10 +174,10 @@ func (r *TokenRenewalJob) renewToken(ctx context.Context, s *privateStore) error const op = "vault.(TokenRenewalJob).renewToken" databaseWrapper, err := r.kms.GetWrapper(ctx, s.ScopeId, kms.KeyPurposeDatabase) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get database wrapper")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get database wrapper")) } if err = s.decrypt(ctx, databaseWrapper); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } token := s.token() @@ -188,7 +188,7 @@ func (r *TokenRenewalJob) renewToken(ctx context.Context, s *privateStore) error vc, err := s.client() if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } var respErr *vault.ResponseError @@ -200,10 +200,10 @@ func (r *TokenRenewalJob) renewToken(ctx context.Context, s *privateStore) error query, values := token.updateStatusQuery(ExpiredToken) numRows, err := r.writer.Exec(ctx, query, values) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if numRows != 1 { - return errors.New(errors.Unknown, op, "token expired but failed to update repo") + return errors.New(ctx, errors.Unknown, op, "token expired but failed to update repo") } if s.TokenStatus == string(CurrentToken) { event.WriteSysEvent(ctx, op, "Vault credential store current token has expired", "credential store id", s.StoreId) @@ -212,28 +212,28 @@ func (r *TokenRenewalJob) renewToken(ctx context.Context, s *privateStore) error // Set credentials associated with this token to expired as Vault will already cascade delete them _, err = r.writer.Exec(ctx, updateCredentialStatusByTokenQuery, []interface{}{ExpiredCredential, token.TokenHmac}) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("error updating credentials to revoked after revoking token")) + return errors.Wrap(ctx, err, op, errors.WithMsg("error updating credentials to revoked after revoking token")) } return nil } if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to renew vault token")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to renew vault token")) } tokenExpires, err := renewedToken.TokenTTL() if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get vault token expiration")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get vault token expiration")) } token.expiration = tokenExpires query, values := token.updateExpirationQuery() numRows, err := r.writer.Exec(ctx, query, values) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if numRows != 1 { - return errors.New(errors.Unknown, op, "token renewed but failed to update repo") + return errors.New(ctx, errors.Unknown, op, "token renewed but failed to update repo") } return nil @@ -244,7 +244,7 @@ func (r *TokenRenewalJob) NextRunIn() (time.Duration, error) { const op = "vault.(TokenRenewalJob).NextRunIn" next, err := nextRenewal(r) if err != nil { - return defaultNextRunIn, errors.Wrap(err, op) + return defaultNextRunIn, errors.WrapDeprecated(err, op) } return next, nil @@ -262,12 +262,12 @@ func nextRenewal(j scheduler.Job) (time.Duration, error) { query = credentialRenewalNextRunInQuery r = job.reader default: - return 0, errors.New(errors.Unknown, op, "unknown job") + return 0, errors.NewDeprecated(errors.Unknown, op, "unknown job") } rows, err := r.Query(context.Background(), query, nil) if err != nil { - return 0, errors.Wrap(err, op) + return 0, errors.WrapDeprecated(err, op) } defer rows.Close() @@ -278,7 +278,7 @@ func nextRenewal(j scheduler.Job) (time.Duration, error) { var n NextRenewal err = r.ScanRows(rows, &n) if err != nil { - return 0, errors.Wrap(err, op) + return 0, errors.WrapDeprecated(err, op) } if n.RenewalIn < 0 { // If we are past the next renewal time, return 0 to schedule immediately @@ -323,13 +323,13 @@ func newTokenRevocationJob(r db.Reader, w db.Writer, kms *kms.Kms, logger hclog. const op = "vault.newTokenRevocationJob" switch { case r == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing db.Reader") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing db.Reader") case w == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing db.Writer") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing db.Writer") case kms == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing kms") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing kms") case logger == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing logger") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing logger") } opts := getOpts(opt...) @@ -361,13 +361,13 @@ func (r *TokenRevocationJob) Status() scheduler.JobStatus { func (r *TokenRevocationJob) Run(ctx context.Context) error { const op = "vault.(TokenRevocationJob).Run" if !r.running.CAS(r.running.Load(), true) { - return errors.New(errors.JobAlreadyRunning, op, "job already running") + return errors.New(ctx, errors.JobAlreadyRunning, op, "job already running") } defer r.running.Store(false) // Verify context is not done before running if err := ctx.Err(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } // Fetch all tokens in the revoke state as well as all tokens in the maintaining state @@ -385,7 +385,7 @@ or var ps []*privateStore err := r.reader.SearchWhere(ctx, &ps, where, nil, db.WithLimit(r.limit)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } // Set numProcessed and numTokens for s report @@ -393,7 +393,7 @@ or for _, s := range ps { // Verify context is not done before renewing next token if err := ctx.Err(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if err := r.revokeToken(ctx, s); err != nil { event.WriteError(ctx, op, err, event.WithInfoMsg("error revoking token", "credential store id", s.StoreId)) @@ -408,10 +408,10 @@ func (r *TokenRevocationJob) revokeToken(ctx context.Context, s *privateStore) e const op = "vault.(TokenRevocationJob).revokeToken" databaseWrapper, err := r.kms.GetWrapper(ctx, s.ScopeId, kms.KeyPurposeDatabase) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get database wrapper")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get database wrapper")) } if err = s.decrypt(ctx, databaseWrapper); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } token := s.token() @@ -422,7 +422,7 @@ func (r *TokenRevocationJob) revokeToken(ctx context.Context, s *privateStore) e vc, err := s.client() if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } var respErr *vault.ResponseError @@ -433,22 +433,22 @@ func (r *TokenRevocationJob) revokeToken(ctx context.Context, s *privateStore) e err = nil } if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to revoke vault token")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to revoke vault token")) } query, values := token.updateStatusQuery(RevokedToken) numRows, err := r.writer.Exec(ctx, query, values) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if numRows != 1 { - return errors.New(errors.Unknown, op, "token revoked but failed to update repo") + return errors.New(ctx, errors.Unknown, op, "token revoked but failed to update repo") } // Set credentials associated with this token to revoked as Vault will already cascade revoke them _, err = r.writer.Exec(ctx, updateCredentialStatusByTokenQuery, []interface{}{RevokedCredential, token.TokenHmac}) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("error updating credentials to revoked after revoking token")) + return errors.Wrap(ctx, err, op, errors.WithMsg("error updating credentials to revoked after revoking token")) } return nil @@ -491,13 +491,13 @@ func newCredentialRenewalJob(r db.Reader, w db.Writer, kms *kms.Kms, logger hclo const op = "vault.newCredentialRenewalJob" switch { case r == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing db.Reader") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing db.Reader") case w == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing db.Writer") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing db.Writer") case kms == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing kms") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing kms") case logger == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing logger") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing logger") } opts := getOpts(opt...) @@ -529,13 +529,13 @@ func (r *CredentialRenewalJob) Status() scheduler.JobStatus { func (r *CredentialRenewalJob) Run(ctx context.Context) error { const op = "vault.(CredentialRenewalJob).Run" if !r.running.CAS(r.running.Load(), true) { - return errors.New(errors.JobAlreadyRunning, op, "job already running") + return errors.New(ctx, errors.JobAlreadyRunning, op, "job already running") } defer r.running.Store(false) // Verify context is not done before running if err := ctx.Err(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } var creds []*privateCredential @@ -544,7 +544,7 @@ func (r *CredentialRenewalJob) Run(ctx context.Context) error { // multiple credentials set to renew in sequence. err := r.reader.SearchWhere(ctx, &creds, `renewal_time < wt_add_seconds_to_now(?) and status = ?`, []interface{}{renewalWindow.Seconds(), ActiveCredential}, db.WithLimit(r.limit)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } // Set numProcessed and numTokens for status report @@ -552,7 +552,7 @@ func (r *CredentialRenewalJob) Run(ctx context.Context) error { for _, c := range creds { // Verify context is not done before renewing next token if err := ctx.Err(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if err := r.renewCred(ctx, c); err != nil { @@ -569,15 +569,15 @@ func (r *CredentialRenewalJob) renewCred(ctx context.Context, c *privateCredenti const op = "vault.(CredentialRenewalJob).renewCred" databaseWrapper, err := r.kms.GetWrapper(ctx, c.ScopeId, kms.KeyPurposeDatabase) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get database wrapper")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get database wrapper")) } if err = c.decrypt(ctx, databaseWrapper); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } vc, err := c.client() if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } cred := c.toCredential() @@ -591,25 +591,25 @@ func (r *CredentialRenewalJob) renewCred(ctx context.Context, c *privateCredenti query, values := cred.updateStatusQuery(ExpiredCredential) numRows, err := r.writer.Exec(ctx, query, values) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if numRows != 1 { - return errors.New(errors.Unknown, op, "credential expired but failed to update repo") + return errors.New(ctx, errors.Unknown, op, "credential expired but failed to update repo") } return nil } if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to renew credential")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to renew credential")) } cred.expiration = time.Duration(renewedCred.LeaseDuration) * time.Second query, values := cred.updateExpirationQuery() numRows, err := r.writer.Exec(ctx, query, values) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if numRows != 1 { - return errors.New(errors.Unknown, op, "credential renewed but failed to update repo") + return errors.New(ctx, errors.Unknown, op, "credential renewed but failed to update repo") } return nil @@ -620,7 +620,7 @@ func (r *CredentialRenewalJob) NextRunIn() (time.Duration, error) { const op = "vault.(CredentialRenewalJob).NextRunIn" next, err := nextRenewal(r) if err != nil { - return defaultNextRunIn, errors.Wrap(err, op) + return defaultNextRunIn, errors.WrapDeprecated(err, op) } return next, nil @@ -659,13 +659,13 @@ func newCredentialRevocationJob(r db.Reader, w db.Writer, kms *kms.Kms, logger h const op = "vault.newCredentialRevocationJob" switch { case r == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing db.Reader") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing db.Reader") case w == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing db.Writer") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing db.Writer") case kms == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing kms") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing kms") case logger == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing logger") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing logger") } opts := getOpts(opt...) @@ -697,19 +697,19 @@ func (r *CredentialRevocationJob) Status() scheduler.JobStatus { func (r *CredentialRevocationJob) Run(ctx context.Context) error { const op = "vault.(CredentialRevocationJob).Run" if !r.running.CAS(r.running.Load(), true) { - return errors.New(errors.JobAlreadyRunning, op, "job already running") + return errors.New(ctx, errors.JobAlreadyRunning, op, "job already running") } defer r.running.Store(false) // Verify context is not done before running if err := ctx.Err(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } var creds []*privateCredential err := r.reader.SearchWhere(ctx, &creds, "status = ?", []interface{}{RevokeCredential}, db.WithLimit(r.limit)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } // Set numProcessed and numTokens for status report @@ -717,7 +717,7 @@ func (r *CredentialRevocationJob) Run(ctx context.Context) error { for _, c := range creds { // Verify context is not done before renewing next token if err := ctx.Err(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if err := r.revokeCred(ctx, c); err != nil { event.WriteError(ctx, op, err, event.WithInfoMsg("error revoking credential", "credential id", c.PublicId)) @@ -732,15 +732,15 @@ func (r *CredentialRevocationJob) revokeCred(ctx context.Context, c *privateCred const op = "vault.(CredentialRenewalJob).revokeCred" databaseWrapper, err := r.kms.GetWrapper(ctx, c.ScopeId, kms.KeyPurposeDatabase) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get database wrapper")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get database wrapper")) } if err = c.decrypt(ctx, databaseWrapper); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } vc, err := c.client() if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } cred := c.toCredential() @@ -752,16 +752,16 @@ func (r *CredentialRevocationJob) revokeCred(ctx context.Context, c *privateCred err = nil } if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to revoke credential")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to revoke credential")) } query, values := cred.updateStatusQuery(RevokedCredential) numRows, err := r.writer.Exec(ctx, query, values) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if numRows != 1 { - return errors.New(errors.Unknown, op, "credential revoked but failed to update repo") + return errors.New(ctx, errors.Unknown, op, "credential revoked but failed to update repo") } return nil @@ -805,13 +805,13 @@ func newCredentialStoreCleanupJob(r db.Reader, w db.Writer, kms *kms.Kms, logger const op = "vault.newCredentialStoreCleanupJob" switch { case r == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing db.Reader") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing db.Reader") case w == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing db.Writer") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing db.Writer") case kms == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing kms") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing kms") case logger == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing logger") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing logger") } opts := getOpts(opt...) @@ -842,13 +842,13 @@ func (r *CredentialStoreCleanupJob) Status() scheduler.JobStatus { func (r *CredentialStoreCleanupJob) Run(ctx context.Context) error { const op = "vault.(CredentialStoreCleanupJob).Run" if !r.running.CAS(r.running.Load(), true) { - return errors.New(errors.JobAlreadyRunning, op, "job already running") + return errors.New(ctx, errors.JobAlreadyRunning, op, "job already running") } defer r.running.Store(false) // Verify context is not done before running if err := ctx.Err(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } // TODO (lcr 06/2021): Oplog does not currently support bulk @@ -857,7 +857,7 @@ func (r *CredentialStoreCleanupJob) Run(ctx context.Context) error { var stores []*CredentialStore err := r.reader.SearchWhere(ctx, &stores, credStoreCleanupWhereClause, []interface{}{RevokeToken}, db.WithLimit(r.limit)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } // Set numProcessed and numStores for status report @@ -865,7 +865,7 @@ func (r *CredentialStoreCleanupJob) Run(ctx context.Context) error { for _, store := range stores { // Verify context is not done before renewing next token if err := ctx.Err(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } oplogWrapper, err := r.kms.GetWrapper(ctx, store.ScopeId, kms.KeyPurposeOplog) @@ -918,7 +918,7 @@ type CredentialCleanupJob struct { func newCredentialCleanupJob(w db.Writer) (*CredentialCleanupJob, error) { const op = "vault.newCredentialCleanupJob" if w == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing db.Writer") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing db.Writer") } return &CredentialCleanupJob{ @@ -942,18 +942,18 @@ func (r *CredentialCleanupJob) Status() scheduler.JobStatus { func (r *CredentialCleanupJob) Run(ctx context.Context) error { const op = "vault.(CredentialCleanupJob).Run" if !r.running.CAS(r.running.Load(), true) { - return errors.New(errors.JobAlreadyRunning, op, "job already running") + return errors.New(ctx, errors.JobAlreadyRunning, op, "job already running") } defer r.running.Store(false) // Verify context is not done before running if err := ctx.Err(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } numRows, err := r.writer.Exec(ctx, credCleanupQuery, nil) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } r.numCreds = numRows diff --git a/internal/credential/vault/private_credential.go b/internal/credential/vault/private_credential.go index 69a75733f..8de6ea963 100644 --- a/internal/credential/vault/private_credential.go +++ b/internal/credential/vault/private_credential.go @@ -57,7 +57,7 @@ func (pc *privateCredential) decrypt(ctx context.Context, cipher wrapping.Wrappe CtToken: pc.CtToken, } if err := structwrapping.UnwrapStruct(ctx, cipher, ptkv, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decrypt), errors.WithMsg("token")) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Decrypt), errors.WithMsg("token")) } pc.Token = ptkv.Token } @@ -71,7 +71,7 @@ func (pc *privateCredential) decrypt(ctx context.Context, cipher wrapping.Wrappe CtKey: pc.CtClientKey, } if err := structwrapping.UnwrapStruct(ctx, cipher, pckv, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decrypt), errors.WithMsg("client certificate")) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Decrypt), errors.WithMsg("client certificate")) } pc.ClientKey = pckv.Key } @@ -96,7 +96,7 @@ func (pc *privateCredential) client() (*client, error) { client, err := newClient(clientConfig) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create vault client")) + return nil, errors.WrapDeprecated(err, op, errors.WithMsg("unable to create vault client")) } return client, nil } diff --git a/internal/credential/vault/private_library.go b/internal/credential/vault/private_library.go index 6e8cc2f00..af52c4555 100644 --- a/internal/credential/vault/private_library.go +++ b/internal/credential/vault/private_library.go @@ -112,7 +112,7 @@ func (pl *privateLibrary) decrypt(ctx context.Context, cipher wrapping.Wrapper) CtToken: pl.CtToken, } if err := structwrapping.UnwrapStruct(ctx, cipher, ptkv, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decrypt), errors.WithMsg("token")) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Decrypt), errors.WithMsg("token")) } pl.Token = ptkv.Token } @@ -126,7 +126,7 @@ func (pl *privateLibrary) decrypt(ctx context.Context, cipher wrapping.Wrapper) CtKey: pl.CtClientKey, } if err := structwrapping.UnwrapStruct(ctx, cipher, pckv, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decrypt), errors.WithMsg("client certificate")) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Decrypt), errors.WithMsg("client certificate")) } pl.ClientKey = pckv.Key } @@ -151,7 +151,7 @@ func (pl *privateLibrary) client() (*client, error) { client, err := newClient(clientConfig) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create vault client")) + return nil, errors.WrapDeprecated(err, op, errors.WithMsg("unable to create vault client")) } return client, nil } @@ -166,7 +166,7 @@ func (r *Repository) getPrivateLibraries(ctx context.Context, requests []credent mapper, err := newMapper(requests) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } libIds := mapper.libIds() @@ -181,7 +181,7 @@ func (r *Repository) getPrivateLibraries(ctx context.Context, requests []credent } rows, err := r.reader.Query(ctx, query, params) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("query failed")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("query failed")) } defer rows.Close() @@ -189,11 +189,11 @@ func (r *Repository) getPrivateLibraries(ctx context.Context, requests []credent for rows.Next() { var lib privateLibrary if err := r.reader.ScanRows(rows, &lib); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("scan row failed")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("scan row failed")) } purps := mapper.get(lib.GetPublicId()) if len(purps) == 0 { - return nil, errors.E(errors.WithCode(errors.InvalidParameter), errors.WithMsg("unknown library")) + return nil, errors.E(ctx, errors.WithCode(errors.InvalidParameter), errors.WithMsg("unknown library")) } for _, purp := range purps { cp := lib.clone() @@ -205,11 +205,11 @@ func (r *Repository) getPrivateLibraries(ctx context.Context, requests []credent for _, pl := range libs { databaseWrapper, err := r.kms.GetWrapper(ctx, pl.ScopeId, kms.KeyPurposeDatabase) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get database wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get database wrapper")) } if err := pl.decrypt(ctx, databaseWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } } @@ -236,7 +236,7 @@ func newMapper(requests []credential.Request) (*requestMap, error) { if purps, ok := ids[req.SourceId]; ok { for _, purp := range purps { if purp == req.Purpose { - return nil, errors.E(errors.WithCode(errors.InvalidParameter), errors.WithMsg("duplicate library and purpose")) + return nil, errors.EDeprecated(errors.WithCode(errors.InvalidParameter), errors.WithMsg("duplicate library and purpose")) } } } diff --git a/internal/credential/vault/private_store.go b/internal/credential/vault/private_store.go index 4bd472ad0..06f5d5e34 100644 --- a/internal/credential/vault/private_store.go +++ b/internal/credential/vault/private_store.go @@ -24,16 +24,16 @@ func (r *Repository) listRevokePrivateStores(ctx context.Context, opt ...Option) var stores []*privateStore where, values := "token_status = ?", []interface{}{"revoke"} if err := r.reader.SearchWhere(ctx, &stores, where, values, db.WithLimit(limit)); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } for _, store := range stores { databaseWrapper, err := r.kms.GetWrapper(ctx, store.ScopeId, kms.KeyPurposeDatabase) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get database wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get database wrapper")) } if err := store.decrypt(ctx, databaseWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } } return stores, nil @@ -42,23 +42,23 @@ func (r *Repository) listRevokePrivateStores(ctx context.Context, opt ...Option) func (r *Repository) lookupPrivateStore(ctx context.Context, publicId string) (*privateStore, error) { const op = "vault.(Repository).lookupPrivateStore" if publicId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no public id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no public id") } ps := allocPrivateStore() if err := r.reader.LookupWhere(ctx, &ps, "public_id = ? and token_status = ?", publicId, CurrentToken); err != nil { if errors.IsNotFoundError(err) { return nil, nil } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for: %s", publicId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for: %s", publicId))) } databaseWrapper, err := r.kms.GetWrapper(ctx, ps.ScopeId, kms.KeyPurposeDatabase) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get database wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get database wrapper")) } if err := ps.decrypt(ctx, databaseWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return ps, nil @@ -159,7 +159,7 @@ func (ps *privateStore) decrypt(ctx context.Context, cipher wrapping.Wrapper) er CtToken: ps.CtToken, } if err := structwrapping.UnwrapStruct(ctx, cipher, ptkv, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decrypt), errors.WithMsg("token")) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Decrypt), errors.WithMsg("token")) } ps.Token = ptkv.Token } @@ -173,7 +173,7 @@ func (ps *privateStore) decrypt(ctx context.Context, cipher wrapping.Wrapper) er CtKey: ps.CtClientKey, } if err := structwrapping.UnwrapStruct(ctx, cipher, pckv, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decrypt), errors.WithMsg("client certificate")) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Decrypt), errors.WithMsg("client certificate")) } ps.ClientKey = pckv.Key } @@ -198,7 +198,7 @@ func (ps *privateStore) client() (*client, error) { client, err := newClient(clientConfig) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create vault client")) + return nil, errors.WrapDeprecated(err, op, errors.WithMsg("unable to create vault client")) } return client, nil } diff --git a/internal/credential/vault/public_ids.go b/internal/credential/vault/public_ids.go index eda136b24..fc896b4a5 100644 --- a/internal/credential/vault/public_ids.go +++ b/internal/credential/vault/public_ids.go @@ -25,7 +25,7 @@ const ( func newCredentialStoreId() (string, error) { id, err := db.NewPublicId(CredentialStorePrefix) if err != nil { - return "", errors.Wrap(err, "vault.newCredentialStoreId") + return "", errors.WrapDeprecated(err, "vault.newCredentialStoreId") } return id, nil } @@ -33,7 +33,7 @@ func newCredentialStoreId() (string, error) { func newCredentialId() (string, error) { id, err := db.NewPublicId(DynamicCredentialPrefix) if err != nil { - return "", errors.Wrap(err, "vault.newCredentialId") + return "", errors.WrapDeprecated(err, "vault.newCredentialId") } return id, nil } @@ -41,7 +41,7 @@ func newCredentialId() (string, error) { func newCredentialLibraryId() (string, error) { id, err := db.NewPublicId(CredentialLibraryPrefix) if err != nil { - return "", errors.Wrap(err, "vault.newCredentialLibraryId") + return "", errors.WrapDeprecated(err, "vault.newCredentialLibraryId") } return id, nil } diff --git a/internal/credential/vault/repository.go b/internal/credential/vault/repository.go index 6901299c1..1f32016dd 100644 --- a/internal/credential/vault/repository.go +++ b/internal/credential/vault/repository.go @@ -27,13 +27,13 @@ func NewRepository(r db.Reader, w db.Writer, kms *kms.Kms, scheduler *scheduler. const op = "vault.NewRepository" switch { case r == nil: - return nil, errors.New(errors.InvalidParameter, op, "db.Reader") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "db.Reader") case w == nil: - return nil, errors.New(errors.InvalidParameter, op, "db.Writer") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "db.Writer") case kms == nil: - return nil, errors.New(errors.InvalidParameter, op, "kms") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "kms") case scheduler == nil: - return nil, errors.New(errors.InvalidParameter, op, "scheduler") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "scheduler") } opts := getOpts(opt...) diff --git a/internal/credential/vault/repository_credential_library.go b/internal/credential/vault/repository_credential_library.go index c084381ef..d28727664 100644 --- a/internal/credential/vault/repository_credential_library.go +++ b/internal/credential/vault/repository_credential_library.go @@ -25,22 +25,22 @@ import ( func (r *Repository) CreateCredentialLibrary(ctx context.Context, scopeId string, l *CredentialLibrary, _ ...Option) (*CredentialLibrary, error) { const op = "vault.(Repository).CreateCredentialLibrary" if l == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil CredentialLibrary") + return nil, errors.New(ctx, errors.InvalidParameter, op, "nil CredentialLibrary") } if l.CredentialLibrary == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil embedded l") + return nil, errors.New(ctx, errors.InvalidParameter, op, "nil embedded l") } if l.StoreId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no store id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no store id") } if l.VaultPath == "" { - return nil, errors.New(errors.InvalidParameter, op, "no vault path") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no vault path") } if l.PublicId != "" { - return nil, errors.New(errors.InvalidParameter, op, "public id not empty") + return nil, errors.New(ctx, errors.InvalidParameter, op, "public id not empty") } if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no scope id") } l = l.clone() @@ -50,13 +50,13 @@ func (r *Repository) CreateCredentialLibrary(ctx context.Context, scopeId string id, err := newCredentialLibraryId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } l.PublicId = id oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var newCredentialLibrary *CredentialLibrary @@ -65,7 +65,7 @@ func (r *Repository) CreateCredentialLibrary(ctx context.Context, scopeId string newCredentialLibrary = l.clone() err := w.Create(ctx, newCredentialLibrary, db.WithOplog(oplogWrapper, l.oplog(oplog.OpType_OP_TYPE_CREATE))) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, @@ -73,9 +73,9 @@ func (r *Repository) CreateCredentialLibrary(ctx context.Context, scopeId string if err != nil { if errors.IsUniqueError(err) { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("in credential store: %s: name %s already exists", l.StoreId, l.Name))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("in credential store: %s: name %s already exists", l.StoreId, l.Name))) } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("in credential store: %s", l.StoreId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("in credential store: %s", l.StoreId))) } return newCredentialLibrary, nil } @@ -97,19 +97,19 @@ func (r *Repository) CreateCredentialLibrary(ctx context.Context, scopeId string func (r *Repository) UpdateCredentialLibrary(ctx context.Context, scopeId string, l *CredentialLibrary, version uint32, fieldMaskPaths []string, _ ...Option) (*CredentialLibrary, int, error) { const op = "vault.(Repository).UpdateCredentialLibrary" if l == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing CredentialLibrary") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing CredentialLibrary") } if l.CredentialLibrary == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing embedded CredentialLibrary") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing embedded CredentialLibrary") } if l.PublicId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidPublicId, op, "missing public id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } if version == 0 { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing version") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing version") } if scopeId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } l = l.clone() @@ -121,7 +121,7 @@ func (r *Repository) UpdateCredentialLibrary(ctx context.Context, scopeId string case strings.EqualFold(httpMethodField, f): case strings.EqualFold(httpRequestBodyField, f): default: - return nil, db.NoRowsAffected, errors.New(errors.InvalidFieldMask, op, f) + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidFieldMask, op, f) } } var dbMask, nullFields []string @@ -144,12 +144,12 @@ func (r *Repository) UpdateCredentialLibrary(ctx context.Context, scopeId string } if len(dbMask) == 0 && len(nullFields) == 0 { - return nil, db.NoRowsAffected, errors.New(errors.EmptyFieldMask, op, "missing field mask") + return nil, db.NoRowsAffected, errors.New(ctx, errors.EmptyFieldMask, op, "missing field mask") } oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithCode(errors.Encrypt), + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt), errors.WithMsg("unable to get oplog wrapper")) } @@ -163,7 +163,7 @@ func (r *Repository) UpdateCredentialLibrary(ctx context.Context, scopeId string db.WithOplog(oplogWrapper, l.oplog(oplog.OpType_OP_TYPE_UPDATE)), db.WithVersion(&version)) if err == nil && rowsUpdated > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been updated") } return err }, @@ -171,10 +171,10 @@ func (r *Repository) UpdateCredentialLibrary(ctx context.Context, scopeId string if err != nil { if errors.IsUniqueError(err) { - return nil, db.NoRowsAffected, errors.New(errors.NotUnique, op, + return nil, db.NoRowsAffected, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("name %s already exists: %s", l.Name, l.PublicId)) } - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(l.PublicId)) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(l.PublicId)) } return returnedCredentialLibrary, rowsUpdated, nil @@ -185,7 +185,7 @@ func (r *Repository) UpdateCredentialLibrary(ctx context.Context, scopeId string func (r *Repository) LookupCredentialLibrary(ctx context.Context, publicId string, _ ...Option) (*CredentialLibrary, error) { const op = "vault.(Repository).LookupCredentialLibrary" if publicId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no public id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no public id") } l := allocCredentialLibrary() l.PublicId = publicId @@ -193,7 +193,7 @@ func (r *Repository) LookupCredentialLibrary(ctx context.Context, publicId strin if errors.IsNotFoundError(err) { return nil, nil } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for: %s", publicId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for: %s", publicId))) } return l, nil } @@ -203,10 +203,10 @@ func (r *Repository) LookupCredentialLibrary(ctx context.Context, publicId strin func (r *Repository) DeleteCredentialLibrary(ctx context.Context, scopeId string, publicId string, _ ...Option) (int, error) { const op = "vault.(Repository).DeleteCredentialLibrary" if publicId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no public id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no public id") } if scopeId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no scope id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no scope id") } l := allocCredentialLibrary() @@ -214,7 +214,7 @@ func (r *Repository) DeleteCredentialLibrary(ctx context.Context, scopeId string oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var rowsDeleted int @@ -224,14 +224,14 @@ func (r *Repository) DeleteCredentialLibrary(ctx context.Context, scopeId string dl := l.clone() rowsDeleted, err = w.Delete(ctx, dl, db.WithOplog(oplogWrapper, l.oplog(oplog.OpType_OP_TYPE_DELETE))) if err == nil && rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 CredentialLibrary would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 CredentialLibrary would have been deleted") } return err }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("delete failed for %s", l.PublicId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("delete failed for %s", l.PublicId))) } return rowsDeleted, nil @@ -242,7 +242,7 @@ func (r *Repository) DeleteCredentialLibrary(ctx context.Context, scopeId string func (r *Repository) ListCredentialLibraries(ctx context.Context, storeId string, opt ...Option) ([]*CredentialLibrary, error) { const op = "vault.(Repository).ListCredentialLibraries" if storeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no storeId") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no storeId") } opts := getOpts(opt...) limit := r.defaultLimit @@ -253,7 +253,7 @@ func (r *Repository) ListCredentialLibraries(ctx context.Context, storeId string var libs []*CredentialLibrary err := r.reader.SearchWhere(ctx, &libs, "store_id = ?", []interface{}{storeId}, db.WithLimit(limit)) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return libs, nil } diff --git a/internal/credential/vault/repository_credential_store.go b/internal/credential/vault/repository_credential_store.go index d5fbe1845..9e724fed4 100644 --- a/internal/credential/vault/repository_credential_store.go +++ b/internal/credential/vault/repository_credential_store.go @@ -41,32 +41,32 @@ import ( func (r *Repository) CreateCredentialStore(ctx context.Context, cs *CredentialStore, _ ...Option) (*CredentialStore, error) { const op = "vault.(Repository).CreateCredentialStore" if cs == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil CredentialStore") + return nil, errors.New(ctx, errors.InvalidParameter, op, "nil CredentialStore") } if cs.CredentialStore == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil embedded CredentialStore") + return nil, errors.New(ctx, errors.InvalidParameter, op, "nil embedded CredentialStore") } if cs.ScopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no scope id") } if len(cs.inputToken) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "no vault token") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no vault token") } if cs.VaultAddress == "" { - return nil, errors.New(errors.InvalidParameter, op, "no vault address") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no vault address") } if cs.PublicId != "" { - return nil, errors.New(errors.InvalidParameter, op, "public id not empty") + return nil, errors.New(ctx, errors.InvalidParameter, op, "public id not empty") } if cs.clientCert != nil && len(cs.clientCert.CertificateKey) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "client certificate without private key") + return nil, errors.New(ctx, errors.InvalidParameter, op, "client certificate without private key") } cs = cs.clone() id, err := newCredentialStoreId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } cs.PublicId = id if cs.clientCert != nil { @@ -75,11 +75,11 @@ func (r *Repository) CreateCredentialStore(ctx context.Context, cs *CredentialSt client, err := cs.client() if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create vault client")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create vault client")) } tokenLookup, err := client.lookupToken() if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to lookup vault token")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to lookup vault token")) } if err := validateTokenLookup(op, tokenLookup); err != nil { return nil, err @@ -87,27 +87,27 @@ func (r *Repository) CreateCredentialStore(ctx context.Context, cs *CredentialSt available, err := client.capabilities(requiredCapabilities.paths()) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get vault capabilities")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get vault capabilities")) } missing := available.missing(requiredCapabilities) if len(missing) > 0 { return nil, - errors.New(errors.VaultTokenMissingCapabilities, op, fmt.Sprintf("missing capabilites: %v", missing)) + errors.New(ctx, errors.VaultTokenMissingCapabilities, op, fmt.Sprintf("missing capabilites: %v", missing)) } renewedToken, err := client.renewToken() if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to renew vault token")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to renew vault token")) } tokenExpires, err := renewedToken.TokenTTL() if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get vault token expiration")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get vault token expiration")) } accessor, err := renewedToken.TokenAccessor() if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get vault token accessor")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get vault token accessor")) } token, err := newToken(id, cs.inputToken, []byte(accessor), tokenExpires) @@ -117,20 +117,20 @@ func (r *Repository) CreateCredentialStore(ctx context.Context, cs *CredentialSt oplogWrapper, err := r.kms.GetWrapper(ctx, cs.ScopeId, kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } databaseWrapper, err := r.kms.GetWrapper(ctx, cs.ScopeId, kms.KeyPurposeDatabase) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get database wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get database wrapper")) } // encrypt if err := token.encrypt(ctx, databaseWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if cs.clientCert != nil { if err := cs.clientCert.encrypt(ctx, databaseWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } } @@ -142,14 +142,14 @@ func (r *Repository) CreateCredentialStore(ctx context.Context, cs *CredentialSt msgs := make([]*oplog.Message, 0, 3) ticket, err := w.GetTicket(cs) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } // insert credential store newCredentialStore = cs.clone() var csOplogMsg oplog.Message if err := w.Create(ctx, newCredentialStore, db.NewOplogMsg(&csOplogMsg)); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } msgs = append(msgs, &csOplogMsg) @@ -158,10 +158,10 @@ func (r *Repository) CreateCredentialStore(ctx context.Context, cs *CredentialSt query, values := newToken.insertQuery() rows, err := w.Exec(ctx, query, values) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rows > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 token would have been created") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 token would have been created") } msgs = append(msgs, newToken.oplogMessage(db.CreateOp)) @@ -175,7 +175,7 @@ func (r *Repository) CreateCredentialStore(ctx context.Context, cs *CredentialSt newClientCertificate = cs.clientCert.clone() var clientCertOplogMsg oplog.Message if err := w.Create(ctx, newClientCertificate, db.NewOplogMsg(&clientCertOplogMsg)); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } msgs = append(msgs, &clientCertOplogMsg) @@ -186,7 +186,7 @@ func (r *Repository) CreateCredentialStore(ctx context.Context, cs *CredentialSt } metadata := cs.oplog(oplog.OpType_OP_TYPE_CREATE) if err := w.WriteOplogEntryWith(ctx, oplogWrapper, ticket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } return nil }, @@ -194,9 +194,9 @@ func (r *Repository) CreateCredentialStore(ctx context.Context, cs *CredentialSt if err != nil { if errors.IsUniqueError(err) { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("in scope: %s: name %s already exists", cs.ScopeId, cs.Name))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("in scope: %s: name %s already exists", cs.ScopeId, cs.Name))) } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("in scope: %s", cs.ScopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("in scope: %s", cs.ScopeId))) } // Best effort update next run time of token renewal job, but an error should not @@ -209,33 +209,33 @@ func (r *Repository) CreateCredentialStore(ctx context.Context, cs *CredentialSt func validateTokenLookup(op errors.Op, s *vault.Secret) error { if s.Data == nil { - return errors.New(errors.InvalidParameter, op, "vault secret is not a token lookup") + return errors.NewDeprecated(errors.InvalidParameter, op, "vault secret is not a token lookup") } if s.Data["renewable"] == nil { - return errors.E(errors.WithCode(errors.VaultTokenNotRenewable), errors.WithOp(op)) + return errors.EDeprecated(errors.WithCode(errors.VaultTokenNotRenewable), errors.WithOp(op)) } renewable, err := parseutil.ParseBool(s.Data["renewable"]) if err != nil { - return errors.Wrap(err, op) + return errors.WrapDeprecated(err, op) } if !renewable { - return errors.E(errors.WithCode(errors.VaultTokenNotRenewable), errors.WithOp(op)) + return errors.EDeprecated(errors.WithCode(errors.VaultTokenNotRenewable), errors.WithOp(op)) } if s.Data["orphan"] == nil { - return errors.E(errors.WithCode(errors.VaultTokenNotOrphan), errors.WithOp(op)) + return errors.EDeprecated(errors.WithCode(errors.VaultTokenNotOrphan), errors.WithOp(op)) } orphan, err := parseutil.ParseBool(s.Data["orphan"]) if err != nil { - return errors.Wrap(err, op) + return errors.WrapDeprecated(err, op) } if !orphan { - return errors.E(errors.WithCode(errors.VaultTokenNotOrphan), errors.WithOp(op)) + return errors.EDeprecated(errors.WithCode(errors.VaultTokenNotOrphan), errors.WithOp(op)) } if s.Data["period"] == nil { - return errors.E(errors.WithCode(errors.VaultTokenNotPeriodic), errors.WithOp(op)) + return errors.EDeprecated(errors.WithCode(errors.VaultTokenNotPeriodic), errors.WithOp(op)) } return nil @@ -246,7 +246,7 @@ func validateTokenLookup(op errors.Op, s *vault.Secret) error { func (r *Repository) LookupCredentialStore(ctx context.Context, publicId string, _ ...Option) (*CredentialStore, error) { const op = "vault.(Repository).LookupCredentialStore" if publicId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no public id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no public id") } agg := allocPublicStore() agg.PublicId = publicId @@ -254,7 +254,7 @@ func (r *Repository) LookupCredentialStore(ctx context.Context, publicId string, if errors.IsNotFoundError(err) { return nil, nil } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for: %s", publicId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for: %s", publicId))) } return agg.toCredentialStore(), nil } @@ -343,19 +343,19 @@ func (ps *publicStore) GetPublicId() string { return ps.PublicId } func (r *Repository) UpdateCredentialStore(ctx context.Context, cs *CredentialStore, version uint32, fieldMaskPaths []string, _ ...Option) (*CredentialStore, int, error) { const op = "vault.(Repository).UpdateCredentialStore" if cs == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing CredentialStore") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing CredentialStore") } if cs.CredentialStore == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing embedded CredentialStore") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing embedded CredentialStore") } if cs.PublicId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidPublicId, op, "missing public id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidPublicId, op, "missing public id") } if version == 0 { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing version") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing version") } if cs.ScopeId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } cs = cs.clone() @@ -378,7 +378,7 @@ func (r *Repository) UpdateCredentialStore(ctx context.Context, cs *CredentialSt validateToken = true } default: - return nil, db.NoRowsAffected, errors.New(errors.InvalidFieldMask, op, f) + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidFieldMask, op, f) } } dbMask, nullFields := dbcommon.BuildUpdatePaths( @@ -410,10 +410,10 @@ func (r *Repository) UpdateCredentialStore(ctx context.Context, cs *CredentialSt fieldMaskPaths, nil, ) if len(certNullFields) != 0 && len(certNullFields) != 2 { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "attempting to unset a required field on a client cert") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "attempting to unset a required field on a client cert") } if len(append(dbMask, certDbMask...)) == 0 && len(append(nullFields, certNullFields...)) == 0 { - return nil, db.NoRowsAffected, errors.New(errors.EmptyFieldMask, op, "missing field mask") + return nil, db.NoRowsAffected, errors.New(ctx, errors.EmptyFieldMask, op, "missing field mask") } var filteredDbMask, filteredNullFields []string @@ -427,7 +427,7 @@ func (r *Repository) UpdateCredentialStore(ctx context.Context, cs *CredentialSt for _, f := range nullFields { switch { case strings.EqualFold(tokenField, f): - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "attempting to unset the value for token") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "attempting to unset the value for token") default: filteredNullFields = append(filteredNullFields, f) } @@ -436,20 +436,20 @@ func (r *Repository) UpdateCredentialStore(ctx context.Context, cs *CredentialSt oplogWrapper, err := r.kms.GetWrapper(ctx, cs.ScopeId, kms.KeyPurposeOplog) if err != nil { return nil, db.NoRowsAffected, - errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } databaseWrapper, err := r.kms.GetWrapper(ctx, cs.ScopeId, kms.KeyPurposeDatabase) if err != nil { return nil, db.NoRowsAffected, - errors.Wrap(err, op, errors.WithMsg("unable to get database wrapper")) + errors.Wrap(ctx, err, op, errors.WithMsg("unable to get database wrapper")) } ps, err := r.lookupPrivateStore(ctx, cs.GetPublicId()) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to lookup private credential store")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to lookup private credential store")) } if ps == nil { - return nil, db.NoRowsAffected, errors.New(errors.RecordNotFound, op, fmt.Sprintf("credential store %s", cs.PublicId)) + return nil, db.NoRowsAffected, errors.New(ctx, errors.RecordNotFound, op, fmt.Sprintf("credential store %s", cs.PublicId)) } origStore := ps.toCredentialStore() origStore.inputToken = ps.Token @@ -457,60 +457,60 @@ func (r *Repository) UpdateCredentialStore(ctx context.Context, cs *CredentialSt origStore.clientCert, err = NewClientCertificate(ps.ClientCert, ps.ClientKey) } if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("can't recreate client certificate for vault client creation")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("can't recreate client certificate for vault client creation")) } updatedStore := origStore.applyUpdate(cs, fieldMaskPaths) if len(certDbMask) > 0 && updatedStore.clientCert != nil { if err := updatedStore.clientCert.encrypt(ctx, databaseWrapper); err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } } var token *Token client, err := updatedStore.client() if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get client for updated store")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get client for updated store")) } if validateToken { tokenLookup, err := client.lookupToken() if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("cannot lookup token for updated store")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("cannot lookup token for updated store")) } if err := validateTokenLookup(op, tokenLookup); err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } available, err := client.capabilities(requiredCapabilities.paths()) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get vault capabilities")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get vault capabilities")) } missing := available.missing(requiredCapabilities) if len(missing) > 0 { return nil, db.NoRowsAffected, - errors.New(errors.VaultTokenMissingCapabilities, op, fmt.Sprintf("missing capabilites: %v", missing)) + errors.New(ctx, errors.VaultTokenMissingCapabilities, op, fmt.Sprintf("missing capabilites: %v", missing)) } } if updateToken { renewedToken, err := client.renewToken() if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to renew vault token")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to renew vault token")) } tokenExpires, err := renewedToken.TokenTTL() if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get vault token expiration")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get vault token expiration")) } accessor, err := renewedToken.TokenAccessor() if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get vault token accessor")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get vault token accessor")) } if token, err = newToken(cs.GetPublicId(), cs.inputToken, []byte(accessor), tokenExpires); err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } // encrypt token if err := token.encrypt(ctx, databaseWrapper); err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } } @@ -521,7 +521,7 @@ func (r *Repository) UpdateCredentialStore(ctx context.Context, cs *CredentialSt msgs := make([]*oplog.Message, 0, 3) ticket, err := w.GetTicket(cs) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } cs := cs.clone() @@ -535,30 +535,30 @@ func (r *Repository) UpdateCredentialStore(ctx context.Context, cs *CredentialSt cs.Version = version + 1 rowsUpdated, err = w.Update(ctx, cs, []string{"Version"}, nil, db.NewOplogMsg(&csOplogMsg), db.WithVersion(&version)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update credential store version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update credential store version")) } switch rowsUpdated { case 1: case 0: return nil default: - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated credential store version and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated credential store version and %d rows updated", rowsUpdated)) } default: rowsUpdated, err = w.Update(ctx, cs, filteredDbMask, filteredNullFields, db.NewOplogMsg(&csOplogMsg), db.WithVersion(&version)) if err != nil { if errors.IsUniqueError(err) { - return errors.New(errors.NotUnique, op, + return errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("name %s already exists: %s", cs.Name, cs.PublicId)) } - return errors.Wrap(err, op, errors.WithMsg("unable to update credential store")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update credential store")) } switch rowsUpdated { case 1: case 0: return nil default: - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated credential store and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated credential store and %d rows updated", rowsUpdated)) } } msgs = append(msgs, &csOplogMsg) @@ -571,23 +571,23 @@ func (r *Repository) UpdateCredentialStore(ctx context.Context, cs *CredentialSt query, values := deleteCert.deleteQuery() rows, err := w.Exec(ctx, query, values) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete client certificate")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete client certificate")) } if rows > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 client certificate would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 client certificate would have been deleted") } msgs = append(msgs, deleteCert.oplogMessage(db.DeleteOp)) case len(certDbMask) > 0: if updatedStore.clientCert == nil { - return errors.New(errors.InvalidParameter, op, "updated cert") + return errors.New(ctx, errors.InvalidParameter, op, "updated cert") } query, values := updatedStore.clientCert.insertQuery() rows, err := w.Exec(ctx, query, values) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to upsert client certificate")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to upsert client certificate")) } if rows > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 client certificate would have been upserted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 client certificate would have been upserted") } } @@ -596,13 +596,13 @@ func (r *Repository) UpdateCredentialStore(ctx context.Context, cs *CredentialSt rows, err := w.Exec(ctx, query, values) if err != nil { if errors.IsUniqueError(err) { - return errors.New(errors.NotUnique, op, + return errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("token already exists")) } - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rows > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 token would have been created") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 token would have been created") } msgs = append(msgs, token.oplogMessage(db.CreateOp)) } @@ -611,13 +611,13 @@ func (r *Repository) UpdateCredentialStore(ctx context.Context, cs *CredentialSt agg := allocPublicStore() agg.PublicId = publicId if err := reader.LookupByPublicId(ctx, agg); err != nil { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to lookup credential store: %s", publicId))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to lookup credential store: %s", publicId))) } returnedCredentialStore = agg.toCredentialStore() metadata := cs.oplog(oplog.OpType_OP_TYPE_UPDATE) if err := w.WriteOplogEntryWith(ctx, oplogWrapper, ticket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } return nil }, @@ -642,7 +642,7 @@ func (r *Repository) UpdateCredentialStore(ctx context.Context, cs *CredentialSt func (r *Repository) ListCredentialStores(ctx context.Context, scopeIds []string, opt ...Option) ([]*CredentialStore, error) { const op = "vault.(Repository).ListCredentialStores" if len(scopeIds) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "no scopeIds") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no scopeIds") } opts := getOpts(opt...) limit := r.defaultLimit @@ -653,7 +653,7 @@ func (r *Repository) ListCredentialStores(ctx context.Context, scopeIds []string var credentialStores []*publicStore err := r.reader.SearchWhere(ctx, &credentialStores, "scope_id in (?)", []interface{}{scopeIds}, db.WithLimit(limit)) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } var out []*CredentialStore for _, ca := range credentialStores { @@ -667,7 +667,7 @@ func (r *Repository) ListCredentialStores(ctx context.Context, scopeIds []string func (r *Repository) DeleteCredentialStore(ctx context.Context, publicId string, _ ...Option) (int, error) { const op = "vault.(Repository).DeleteCredentialStore" if publicId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no public id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no public id") } cs := allocCredentialStore() @@ -676,15 +676,15 @@ func (r *Repository) DeleteCredentialStore(ctx context.Context, publicId string, if errors.IsNotFoundError(err) { return db.NoRowsAffected, nil } - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", publicId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", publicId))) } if cs.ScopeId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no scope id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no scope id") } oplogWrapper, err := r.kms.GetWrapper(ctx, cs.ScopeId, kms.KeyPurposeOplog) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var rows int @@ -695,15 +695,15 @@ func (r *Repository) DeleteCredentialStore(ctx context.Context, publicId string, var msgs []*oplog.Message ticket, err := w.GetTicket(cs) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } rows, err = w.Exec(ctx, query, values) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rows > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 credential store would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 credential store would have been deleted") } msg := cs.oplogMessage(db.UpdateOp) msg.FieldMaskPaths = []string{"DeleteTime"} @@ -711,7 +711,7 @@ func (r *Repository) DeleteCredentialStore(ctx context.Context, publicId string, metadata := cs.oplog(oplog.OpType_OP_TYPE_UPDATE) if err := w.WriteOplogEntryWith(ctx, oplogWrapper, ticket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } return nil @@ -719,7 +719,7 @@ func (r *Repository) DeleteCredentialStore(ctx context.Context, publicId string, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("delete failed for %s", cs.PublicId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("delete failed for %s", cs.PublicId))) } if rows > 0 { diff --git a/internal/credential/vault/repository_credentials.go b/internal/credential/vault/repository_credentials.go index 6bd18454a..c06cc385f 100644 --- a/internal/credential/vault/repository_credentials.go +++ b/internal/credential/vault/repository_credentials.go @@ -18,15 +18,15 @@ var _ credential.Issuer = (*Repository)(nil) func (r *Repository) Issue(ctx context.Context, sessionId string, requests []credential.Request) ([]credential.Dynamic, error) { const op = "vault.(Repository).Issue" if sessionId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no session id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no session id") } if len(requests) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "no requests") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no requests") } libs, err := r.getPrivateLibraries(ctx, requests) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } // TODO(mgaffney)(ICU-1329) 05/2021: if any error occurs, mark all credentials @@ -40,12 +40,12 @@ func (r *Repository) Issue(ctx context.Context, sessionId string, requests []cre // if there is no way to save it in the database. credId, err := newCredentialId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } client, err := lib.client() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } var secret *vault.Secret @@ -55,13 +55,13 @@ func (r *Repository) Issue(ctx context.Context, sessionId string, requests []cre case MethodPost: secret, err = client.post(lib.VaultPath, lib.HttpRequestBody) default: - return nil, errors.New(errors.Internal, op, fmt.Sprintf("unknown http method: library: %s", lib.PublicId)) + return nil, errors.New(ctx, errors.Internal, op, fmt.Sprintf("unknown http method: library: %s", lib.PublicId)) } if err != nil { // TODO(mgaffney) 05/2021: detect if the error is because of an // expired or invalid token - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } leaseDuration := time.Duration(secret.LeaseDuration) * time.Second @@ -70,7 +70,7 @@ func (r *Repository) Issue(ctx context.Context, sessionId string, requests []cre } cred, err := newCredential(lib.GetPublicId(), sessionId, secret.LeaseID, lib.TokenHmac, leaseDuration) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } cred.PublicId = credId cred.IsRenewable = secret.Renewable @@ -82,24 +82,24 @@ func (r *Repository) Issue(ctx context.Context, sessionId string, requests []cre rowsInserted, err := w.Exec(ctx, insertQuery, insertQueryValues) switch { case err != nil: - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) case rowsInserted > 1: - return errors.New(errors.MultipleRecords, op, "more than 1 credential would have been inserted") + 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(err, op) + return errors.Wrap(ctx, err, op) case rowsUpdated == 0: - return errors.New(errors.InvalidDynamicCredential, op, "no matching dynamic credential for session found") + return errors.New(ctx, errors.InvalidDynamicCredential, op, "no matching dynamic credential for session found") case rowsUpdated > 1: - return errors.New(errors.MultipleRecords, op, "more than 1 session credential would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 session credential would have been updated") } return nil }, ); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } creds = append(creds, &actualCredential{ @@ -125,13 +125,13 @@ var _ credential.Revoker = (*Repository)(nil) func (r *Repository) Revoke(ctx context.Context, sessionId string) error { const op = "vault.(Repository).Revoke" if sessionId == "" { - return errors.New(errors.InvalidParameter, op, "no session id") + 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, []interface{}{sessionId}); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, diff --git a/internal/credential/vault/vault.go b/internal/credential/vault/vault.go index dbdc292e7..a12592199 100644 --- a/internal/credential/vault/vault.go +++ b/internal/credential/vault/vault.go @@ -47,7 +47,7 @@ type client struct { func newClient(c *clientConfig) (*client, error) { const op = "vault.newClient" if !c.isValid() { - return nil, errors.New(errors.InvalidParameter, op, "invalid configuration") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "invalid configuration") } vc := vault.DefaultConfig() vc.Address = c.Addr @@ -58,14 +58,14 @@ func newClient(c *clientConfig) (*client, error) { tlsConfig := vc.HttpClient.Transport.(*http.Transport).TLSClientConfig tlsConfig.InsecureSkipVerify = c.TlsSkipVerify if err := rootcerts.ConfigureTLS(tlsConfig, rootConfig); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.WrapDeprecated(err, op) } } if c.isClientTLS() { clientCert, err := tls.X509KeyPair(c.ClientCert, c.ClientKey) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.WrapDeprecated(err, op) } tlsConfig := vc.HttpClient.Transport.(*http.Transport).TLSClientConfig tlsConfig.GetClientCertificate = func(*tls.CertificateRequestInfo) (*tls.Certificate, error) { @@ -75,7 +75,7 @@ func newClient(c *clientConfig) (*client, error) { vClient, err := vault.NewClient(vc) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.WrapDeprecated(err, op) } vClient.SetToken(string(c.Token)) @@ -94,11 +94,11 @@ func (c *client) ping() error { h, err := c.cl.Sys().Health() switch { case err != nil: - return errors.Wrap(err, op, errors.WithCode(errors.Unknown), errors.WithMsg(fmt.Sprintf("vault: %s", c.cl.Address()))) + return errors.WrapDeprecated(err, op, errors.WithCode(errors.Unknown), errors.WithMsg(fmt.Sprintf("vault: %s", c.cl.Address()))) case h == nil: - return errors.New(errors.Unavailable, op, fmt.Sprintf("no repsonse: vault: %s", c.cl.Address())) + return errors.NewDeprecated(errors.Unavailable, op, fmt.Sprintf("no repsonse: vault: %s", c.cl.Address())) case !h.Initialized || h.Sealed: - return errors.New(errors.Unavailable, op, fmt.Sprintf("vault (%s): initialized: %t, sealed: %t ", c.cl.Address(), h.Initialized, h.Sealed)) + return errors.NewDeprecated(errors.Unavailable, op, fmt.Sprintf("vault (%s): initialized: %t, sealed: %t ", c.cl.Address(), h.Initialized, h.Sealed)) } return nil @@ -112,7 +112,7 @@ func (c *client) renewToken() (*vault.Secret, error) { const op = "vault.(client).renewToken" t, err := c.cl.Auth().Token().RenewSelf(0) if err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.Unknown), errors.WithMsg(fmt.Sprintf("vault: %s", c.cl.Address()))) + return nil, errors.WrapDeprecated(err, op, errors.WithCode(errors.Unknown), errors.WithMsg(fmt.Sprintf("vault: %s", c.cl.Address()))) } return t, nil } @@ -124,7 +124,7 @@ func (c *client) revokeToken() error { const op = "vault.(client).revokeToken" // The `token` parameter is kept for backwards compatibility but is ignored, so use "" if err := c.cl.Auth().Token().RevokeSelf(""); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Unknown), errors.WithMsg(fmt.Sprintf("vault: %s", c.cl.Address()))) + return errors.WrapDeprecated(err, op, errors.WithCode(errors.Unknown), errors.WithMsg(fmt.Sprintf("vault: %s", c.cl.Address()))) } return nil } @@ -137,7 +137,7 @@ func (c *client) renewLease(leaseId string, leaseDuration time.Duration) (*vault const op = "vault.(client).renewLease" t, err := c.cl.Sys().Renew(leaseId, int(leaseDuration.Round(time.Second).Seconds())) if err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.VaultCredentialRequest), errors.WithMsg(fmt.Sprintf("vault: %s", c.cl.Address()))) + return nil, errors.WrapDeprecated(err, op, errors.WithCode(errors.VaultCredentialRequest), errors.WithMsg(fmt.Sprintf("vault: %s", c.cl.Address()))) } return t, nil } @@ -148,7 +148,7 @@ func (c *client) renewLease(leaseId string, leaseDuration time.Duration) (*vault func (c *client) revokeLease(leaseId string) error { const op = "vault.(client).revokeLease" if err := c.cl.Sys().Revoke(leaseId); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Unknown), errors.WithMsg(fmt.Sprintf("vault: %s", c.cl.Address()))) + return errors.WrapDeprecated(err, op, errors.WithCode(errors.Unknown), errors.WithMsg(fmt.Sprintf("vault: %s", c.cl.Address()))) } return nil } @@ -161,7 +161,7 @@ func (c *client) lookupToken() (*vault.Secret, error) { const op = "vault.(client).lookupToken" t, err := c.cl.Auth().Token().LookupSelf() if err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.Unknown), errors.WithMsg(fmt.Sprintf("vault: %s", c.cl.Address()))) + return nil, errors.WrapDeprecated(err, op, errors.WithCode(errors.Unknown), errors.WithMsg(fmt.Sprintf("vault: %s", c.cl.Address()))) } return t, nil } @@ -178,7 +178,7 @@ func (c *client) get(path string) (*vault.Secret, error) { const op = "vault.(client).get" s, err := c.cl.Logical().Read(path) if err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.VaultCredentialRequest), errors.WithMsg(fmt.Sprintf("vault: %s", c.cl.Address()))) + return nil, errors.WrapDeprecated(err, op, errors.WithCode(errors.VaultCredentialRequest), errors.WithMsg(fmt.Sprintf("vault: %s", c.cl.Address()))) } return s, nil } @@ -193,7 +193,7 @@ func (c *client) post(path string, data []byte) (*vault.Secret, error) { } s, err := c.cl.Logical().WriteBytes(path, data) if err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.VaultCredentialRequest), errors.WithMsg(fmt.Sprintf("vault: %s", c.cl.Address()))) + return nil, errors.WrapDeprecated(err, op, errors.WithCode(errors.VaultCredentialRequest), errors.WithMsg(fmt.Sprintf("vault: %s", c.cl.Address()))) } return s, nil } @@ -205,7 +205,7 @@ func (c *client) post(path string, data []byte) (*vault.Secret, error) { func (c *client) capabilities(paths []string) (pathCapabilities, error) { const op = "vault.(client).capabilities" if len(paths) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "empty paths") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "empty paths") } body := map[string]string{ "paths": strings.Join(paths, ","), @@ -230,7 +230,7 @@ func (c *client) capabilities(paths []string) (pathCapabilities, error) { return nil, err } if secret == nil || secret.Data == nil { - return nil, errors.New(errors.Unknown, op, "data from Vault is empty") + return nil, errors.NewDeprecated(errors.Unknown, op, "data from Vault is empty") } var res map[string][]string diff --git a/internal/credential/vault/vault_token.go b/internal/credential/vault/vault_token.go index 53f18234a..8836f3b98 100644 --- a/internal/credential/vault/vault_token.go +++ b/internal/credential/vault/vault_token.go @@ -56,16 +56,16 @@ type Token struct { func newToken(storeId string, token TokenSecret, accessor []byte, expiration time.Duration) (*Token, error) { const op = "vault.newToken" if storeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no store id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "no store id") } if len(token) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "no vault token") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "no vault token") } if len(accessor) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "no vault token accessor") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "no vault token accessor") } if expiration == 0 { - return nil, errors.New(errors.InvalidParameter, op, "no expiration") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "no expiration") } tokenCopy := make(TokenSecret, len(token)) @@ -120,7 +120,7 @@ func (t *Token) SetTableName(n string) { func (t *Token) encrypt(ctx context.Context, cipher wrapping.Wrapper) error { const op = "vault.(Token).encrypt" if err := structwrapping.WrapStruct(ctx, cipher, t.Token, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Encrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt)) } t.KeyId = cipher.KeyID() return nil @@ -129,7 +129,7 @@ func (t *Token) encrypt(ctx context.Context, cipher wrapping.Wrapper) error { func (t *Token) decrypt(ctx context.Context, cipher wrapping.Wrapper) error { const op = "vault.(Token).decrypt" if err := structwrapping.UnwrapStruct(ctx, cipher, t.Token, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Decrypt)) } return nil } diff --git a/internal/db/common/update.go b/internal/db/common/update.go index 012c5cbd3..fd40ee2ac 100644 --- a/internal/db/common/update.go +++ b/internal/db/common/update.go @@ -19,7 +19,7 @@ import ( func UpdateFields(i interface{}, fieldMaskPaths []string, setToNullPaths []string) (map[string]interface{}, error) { const op = "common.UpdateFields" if i == nil { - return nil, errors.New(errors.InvalidParameter, op, "interface is missing") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "interface is missing") } if fieldMaskPaths == nil { fieldMaskPaths = []string{} @@ -28,15 +28,15 @@ func UpdateFields(i interface{}, fieldMaskPaths []string, setToNullPaths []strin setToNullPaths = []string{} } if len(fieldMaskPaths) == 0 && len(setToNullPaths) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "both fieldMaskPaths and setToNullPaths are zero len") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "both fieldMaskPaths and setToNullPaths are zero len") } inter, maskPaths, nullPaths, err := Intersection(fieldMaskPaths, setToNullPaths) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.WrapDeprecated(err, op) } if len(inter) != 0 { - return nil, errors.New(errors.InvalidParameter, op, "fieldMashPaths and setToNullPaths cannot intersect") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "fieldMashPaths and setToNullPaths cannot intersect") } updateFields := map[string]interface{}{} // case sensitive update fields to values @@ -87,11 +87,11 @@ func UpdateFields(i interface{}, fieldMaskPaths []string, setToNullPaths []strin } if missing := findMissingPaths(setToNullPaths, found); len(missing) != 0 { - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("null paths not found in resource: %s", missing)) + return nil, errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("null paths not found in resource: %s", missing)) } if missing := findMissingPaths(fieldMaskPaths, found); len(missing) != 0 { - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("field mask paths not found in resource: %s", missing)) + return nil, errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("field mask paths not found in resource: %s", missing)) } return updateFields, nil @@ -114,10 +114,10 @@ func findMissingPaths(paths []string, foundPaths map[string]struct{}) []string { func Intersection(av, bv []string) ([]string, map[string]string, map[string]string, error) { const op = "common.Intersection" if av == nil { - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "av is missing") + return nil, nil, nil, errors.NewDeprecated(errors.InvalidParameter, op, "av is missing") } if bv == nil { - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "bv is missing") + return nil, nil, nil, errors.NewDeprecated(errors.InvalidParameter, op, "bv is missing") } if len(av) == 0 && len(bv) == 0 { return []string{}, map[string]string{}, map[string]string{}, nil diff --git a/internal/db/id.go b/internal/db/id.go index 8847f812d..bf142a3c5 100644 --- a/internal/db/id.go +++ b/internal/db/id.go @@ -22,7 +22,7 @@ func NewPublicId(prefix string, opt ...Option) (string, error) { func newId(prefix string, opt ...Option) (string, error) { const op = "db.newId" if prefix == "" { - return "", errors.New(errors.InvalidParameter, op, "missing prefix") + return "", errors.NewDeprecated(errors.InvalidParameter, op, "missing prefix") } var publicId string var err error @@ -35,7 +35,7 @@ func newId(prefix string, opt ...Option) (string, error) { publicId, err = base62.Random(10) } if err != nil { - return "", errors.Wrap(err, op, errors.WithMsg("unable to generate id"), errors.WithCode(errors.Io)) + return "", errors.WrapDeprecated(err, op, errors.WithMsg("unable to generate id"), errors.WithCode(errors.Io)) } return fmt.Sprintf("%s_%s", prefix, publicId), nil } diff --git a/internal/db/read_writer.go b/internal/db/read_writer.go index 62f2b6152..e13373ba3 100644 --- a/internal/db/read_writer.go +++ b/internal/db/read_writer.go @@ -206,14 +206,14 @@ func New(underlying *gorm.DB) *Db { // Exec will execute the sql with the values as parameters. The int returned // is the number of rows affected by the sql. No options are currently // supported. -func (rw *Db) Exec(_ context.Context, sql string, values []interface{}, _ ...Option) (int, error) { +func (rw *Db) Exec(ctx context.Context, sql string, values []interface{}, _ ...Option) (int, error) { const op = "db.Exec" if sql == "" { - return NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing sql") + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing sql") } gormDb := rw.underlying.Exec(sql, values...) if gormDb.Error != nil { - return NoRowsAffected, errors.Wrap(gormDb.Error, op) + return NoRowsAffected, errors.Wrap(ctx, gormDb.Error, op) } return int(gormDb.RowsAffected), nil } @@ -222,14 +222,14 @@ func (rw *Db) Exec(_ context.Context, sql string, values []interface{}, _ ...Opt // operate within the context of any ongoing transaction for the db.Reader. The // caller must close the returned *sql.Rows. Query can/should be used in // combination with ScanRows. -func (rw *Db) Query(_ context.Context, sql string, values []interface{}, _ ...Option) (*sql.Rows, error) { +func (rw *Db) Query(ctx context.Context, sql string, values []interface{}, _ ...Option) (*sql.Rows, error) { const op = "db.Query" if sql == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing sql") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing sql") } gormDb := rw.underlying.Raw(sql, values...) if gormDb.Error != nil { - return nil, errors.Wrap(gormDb.Error, op) + return nil, errors.Wrap(ctx, gormDb.Error, op) } return gormDb.Rows() } @@ -238,10 +238,10 @@ func (rw *Db) Query(_ context.Context, sql string, values []interface{}, _ ...Op func (rw *Db) ScanRows(rows *sql.Rows, result interface{}) error { const op = "db.ScanRows" if rw.underlying == nil { - return errors.New(errors.InvalidParameter, op, "missing underlying db") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing underlying db") } if isNil(result) { - return errors.New(errors.InvalidParameter, op, "missing result") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing result") } return rw.underlying.ScanRows(rows, result) } @@ -255,7 +255,7 @@ func (rw *Db) lookupAfterWrite(ctx context.Context, i interface{}, opt ...Option return nil } if err := rw.LookupById(ctx, i, opt...); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -267,21 +267,21 @@ func (rw *Db) lookupAfterWrite(ctx context.Context, i interface{}, opt ...Option func (rw *Db) Create(ctx context.Context, i interface{}, opt ...Option) error { const op = "db.Create" if rw.underlying == nil { - return errors.New(errors.InvalidParameter, op, "missing underlying db") + return errors.New(ctx, errors.InvalidParameter, op, "missing underlying db") } if isNil(i) { - return errors.New(errors.InvalidParameter, op, "missing interface") + return errors.New(ctx, errors.InvalidParameter, op, "missing interface") } opts := GetOpts(opt...) withOplog := opts.withOplog if withOplog && opts.newOplogMsg != nil { - return errors.New(errors.InvalidParameter, op, "both WithOplog and NewOplogMsg options have been specified") + return errors.New(ctx, errors.InvalidParameter, op, "both WithOplog and NewOplogMsg options have been specified") } if withOplog { // let's validate oplog options before we start writing to the database - _, err := validateOplogArgs(i, opts) + _, err := validateOplogArgs(ctx, i, opts) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("oplog validation failed")) + return errors.Wrap(ctx, err, op, errors.WithMsg("oplog validation failed")) } } // these fields should be nil, since they are not writeable and we want the @@ -291,7 +291,7 @@ func (rw *Db) Create(ctx context.Context, i interface{}, opt ...Option) error { if !opts.withSkipVetForWrite { if vetter, ok := i.(VetForWriter); ok { if err := vetter.VetForWrite(ctx, rw, CreateOp); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } } } @@ -300,26 +300,26 @@ func (rw *Db) Create(ctx context.Context, i interface{}, opt ...Option) error { var err error ticket, err = rw.GetTicket(i) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } } if err := rw.underlying.Create(i).Error; err != nil { - return errors.Wrap(err, op, errors.WithMsg("create failed")) + return errors.Wrap(ctx, err, op, errors.WithMsg("create failed")) } if withOplog { if err := rw.addOplog(ctx, CreateOp, opts, ticket, i); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } } if opts.newOplogMsg != nil { msg, err := rw.newOplogMessage(ctx, CreateOp, i) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("returning oplog failed")) + return errors.Wrap(ctx, err, op, errors.WithMsg("returning oplog failed")) } *opts.newOplogMsg = *msg } if err := rw.lookupAfterWrite(ctx, i, opt...); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -330,20 +330,20 @@ func (rw *Db) Create(ctx context.Context, i interface{}, opt ...Option) error { func (rw *Db) CreateItems(ctx context.Context, createItems []interface{}, opt ...Option) error { const op = "db.CreateItems" if rw.underlying == nil { - return errors.New(errors.InvalidParameter, op, "missing underlying db") + return errors.New(ctx, errors.InvalidParameter, op, "missing underlying db") } if len(createItems) == 0 { - return errors.New(errors.InvalidParameter, op, "missing interfaces") + return errors.New(ctx, errors.InvalidParameter, op, "missing interfaces") } opts := GetOpts(opt...) if opts.withLookup { - return errors.New(errors.InvalidParameter, op, "with lookup not a supported option") + return errors.New(ctx, errors.InvalidParameter, op, "with lookup not a supported option") } if opts.newOplogMsg != nil { - return errors.New(errors.InvalidParameter, op, "new oplog msg (singular) is not a supported option") + return errors.New(ctx, errors.InvalidParameter, op, "new oplog msg (singular) is not a supported option") } if opts.withOplog && opts.newOplogMsgs != nil { - return errors.New(errors.InvalidParameter, op, "both WithOplog and NewOplogMsgs options have been specified") + return errors.New(ctx, errors.InvalidParameter, op, "both WithOplog and NewOplogMsgs options have been specified") } // verify that createItems are all the same type. var foundType reflect.Type @@ -353,34 +353,34 @@ func (rw *Db) CreateItems(ctx context.Context, createItems []interface{}, opt .. } currentType := reflect.TypeOf(v) if foundType != currentType { - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("create items contains disparate types. item %d is not a %s", i, foundType.Name())) + return errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("create items contains disparate types. item %d is not a %s", i, foundType.Name())) } } var ticket *store.Ticket if opts.withOplog { - _, err := validateOplogArgs(createItems[0], opts) + _, err := validateOplogArgs(ctx, createItems[0], opts) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("oplog validation failed")) + return errors.Wrap(ctx, err, op, errors.WithMsg("oplog validation failed")) } ticket, err = rw.GetTicket(createItems[0]) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } } for _, item := range createItems { if err := rw.Create(ctx, item); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } } if opts.withOplog { if err := rw.addOplogForItems(ctx, CreateOp, opts, ticket, createItems); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add oplog")) } } if opts.newOplogMsgs != nil { msgs, err := rw.oplogMsgsForItems(ctx, CreateOp, opts, createItems) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("returning oplog msgs failed")) + return errors.Wrap(ctx, err, op, errors.WithMsg("returning oplog msgs failed")) } *opts.newOplogMsgs = append(*opts.newOplogMsgs, msgs...) } @@ -409,59 +409,59 @@ func (rw *Db) CreateItems(ctx context.Context, createItems []interface{}, opt .. func (rw *Db) Update(ctx context.Context, i interface{}, fieldMaskPaths []string, setToNullPaths []string, opt ...Option) (int, error) { const op = "db.Update" if rw.underlying == nil { - return NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing underlying db") + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing underlying db") } if isNil(i) { - return NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing interface") + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing interface") } if len(fieldMaskPaths) == 0 && len(setToNullPaths) == 0 { - return NoRowsAffected, errors.New(errors.InvalidParameter, op, "both fieldMaskPaths and setToNullPaths are missing") + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "both fieldMaskPaths and setToNullPaths are missing") } opts := GetOpts(opt...) withOplog := opts.withOplog if withOplog && opts.newOplogMsg != nil { - return NoRowsAffected, errors.New(errors.InvalidParameter, op, "both WithOplog and NewOplogMsg options have been specified") + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "both WithOplog and NewOplogMsg options have been specified") } // we need to filter out some non-updatable fields (like: CreateTime, etc) fieldMaskPaths = filterPaths(fieldMaskPaths) setToNullPaths = filterPaths(setToNullPaths) if len(fieldMaskPaths) == 0 && len(setToNullPaths) == 0 { - return NoRowsAffected, errors.New(errors.InvalidParameter, op, "after filtering non-updated fields, there are no fields left in fieldMaskPaths or setToNullPaths") + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "after filtering non-updated fields, there are no fields left in fieldMaskPaths or setToNullPaths") } updateFields, err := common.UpdateFields(i, fieldMaskPaths, setToNullPaths) if err != nil { - return NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("getting update fields failed")) + return NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("getting update fields failed")) } if len(updateFields) == 0 { - return NoRowsAffected, errors.New(errors.InvalidParameter, op, fmt.Sprintf("no fields matched using fieldMaskPaths %s", fieldMaskPaths)) + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("no fields matched using fieldMaskPaths %s", fieldMaskPaths)) } // This is not a boundary scope, but rather a gorm Scope: // https://godoc.org/github.com/jinzhu/gorm#DB.NewScope scope := rw.underlying.NewScope(i) if scope.PrimaryKeyZero() { - return NoRowsAffected, errors.New(errors.InvalidParameter, op, "primary key is not set") + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "primary key is not set") } for _, f := range scope.PrimaryFields() { if contains(fieldMaskPaths, f.Name) { - return NoRowsAffected, errors.New(errors.InvalidFieldMask, op, fmt.Sprintf("not allowed on primary key field %s", f.Name)) + return NoRowsAffected, errors.New(ctx, errors.InvalidFieldMask, op, fmt.Sprintf("not allowed on primary key field %s", f.Name)) } } if withOplog { // let's validate oplog options before we start writing to the database - _, err := validateOplogArgs(i, opts) + _, err := validateOplogArgs(ctx, i, opts) if err != nil { - return NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("oplog validation failed")) + return NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("oplog validation failed")) } } if !opts.withSkipVetForWrite { if vetter, ok := i.(VetForWriter); ok { if err := vetter.VetForWrite(ctx, rw, UpdateOp, WithFieldMaskPaths(fieldMaskPaths), WithNullPaths(setToNullPaths)); err != nil { - return NoRowsAffected, errors.Wrap(err, op) + return NoRowsAffected, errors.Wrap(ctx, err, op) } } } @@ -470,7 +470,7 @@ func (rw *Db) Update(ctx context.Context, i interface{}, fieldMaskPaths []string var err error ticket, err = rw.GetTicket(i) if err != nil { - return NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } } var underlying *gorm.DB @@ -480,10 +480,10 @@ func (rw *Db) Update(ctx context.Context, i interface{}, fieldMaskPaths []string var args []interface{} if opts.WithVersion != nil { if *opts.WithVersion == 0 { - return NoRowsAffected, errors.New(errors.InvalidParameter, op, "with version option is zero") + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "with version option is zero") } if _, ok := scope.FieldByName("version"); !ok { - return NoRowsAffected, errors.New(errors.InvalidParameter, op, fmt.Sprintf("%s does not have a version field", scope.TableName())) + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s does not have a version field", scope.TableName())) } where, args = append(where, "version = ?"), append(args, opts.WithVersion) } @@ -496,9 +496,9 @@ func (rw *Db) Update(ctx context.Context, i interface{}, fieldMaskPaths []string } if underlying.Error != nil { if underlying.Error == gorm.ErrRecordNotFound { - return NoRowsAffected, errors.E(errors.WithCode(errors.RecordNotFound), errors.WithOp(op)) + return NoRowsAffected, errors.E(ctx, errors.WithCode(errors.RecordNotFound), errors.WithOp(op)) } - return NoRowsAffected, errors.Wrap(underlying.Error, op) + return NoRowsAffected, errors.Wrap(ctx, underlying.Error, op) } rowsUpdated := int(underlying.RowsAffected) if rowsUpdated > 0 && (withOplog || opts.newOplogMsg != nil) { @@ -516,13 +516,13 @@ func (rw *Db) Update(ctx context.Context, i interface{}, fieldMaskPaths []string } if withOplog { if err := rw.addOplog(ctx, UpdateOp, oplogOpts, ticket, i); err != nil { - return rowsUpdated, errors.Wrap(err, op, errors.WithMsg("add oplog failed")) + return rowsUpdated, errors.Wrap(ctx, err, op, errors.WithMsg("add oplog failed")) } } if opts.newOplogMsg != nil { msg, err := rw.newOplogMessage(ctx, UpdateOp, i, WithFieldMaskPaths(oplogFieldMasks), WithNullPaths(oplogNullPaths)) if err != nil { - return rowsUpdated, errors.Wrap(err, op, errors.WithMsg("returning oplog failed")) + return rowsUpdated, errors.Wrap(ctx, err, op, errors.WithMsg("returning oplog failed")) } *opts.newOplogMsg = *msg } @@ -531,7 +531,7 @@ func (rw *Db) Update(ctx context.Context, i interface{}, fieldMaskPaths []string // from the db opt = append(opt, WithLookup(true)) if err := rw.lookupAfterWrite(ctx, i, opt...); err != nil { - return NoRowsAffected, errors.Wrap(err, op) + return NoRowsAffected, errors.Wrap(ctx, err, op) } return rowsUpdated, nil } @@ -544,28 +544,28 @@ func (rw *Db) Update(ctx context.Context, i interface{}, fieldMaskPaths []string func (rw *Db) Delete(ctx context.Context, i interface{}, opt ...Option) (int, error) { const op = "db.Delete" if rw.underlying == nil { - return NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing underlying db") + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing underlying db") } if isNil(i) { - return NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing interface") + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing interface") } opts := GetOpts(opt...) withOplog := opts.withOplog if withOplog && opts.newOplogMsg != nil { - return NoRowsAffected, errors.New(errors.InvalidParameter, op, "both WithOplog and NewOplogMsg options have been specified") + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "both WithOplog and NewOplogMsg options have been specified") } // This is not a boundary scope, but rather a gorm Scope: // https://godoc.org/github.com/jinzhu/gorm#DB.NewScope scope := rw.underlying.NewScope(i) if opts.withWhereClause == "" { if scope.PrimaryKeyZero() { - return NoRowsAffected, errors.New(errors.InvalidParameter, op, "primary key is not set") + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "primary key is not set") } } if withOplog { - _, err := validateOplogArgs(i, opts) + _, err := validateOplogArgs(ctx, i, opts) if err != nil { - return NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("oplog validation failed")) + return NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("oplog validation failed")) } } var ticket *store.Ticket @@ -573,7 +573,7 @@ func (rw *Db) Delete(ctx context.Context, i interface{}, opt ...Option) (int, er var err error ticket, err = rw.GetTicket(i) if err != nil { - return NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } } db := rw.underlying @@ -582,19 +582,19 @@ func (rw *Db) Delete(ctx context.Context, i interface{}, opt ...Option) (int, er } db = db.Delete(i) if db.Error != nil { - return NoRowsAffected, errors.Wrap(db.Error, op) + return NoRowsAffected, errors.Wrap(ctx, db.Error, op) } rowsDeleted := int(db.RowsAffected) if rowsDeleted > 0 && (withOplog || opts.newOplogMsg != nil) { if withOplog { if err := rw.addOplog(ctx, DeleteOp, opts, ticket, i); err != nil { - return rowsDeleted, errors.Wrap(err, op, errors.WithMsg("add oplog failed")) + return rowsDeleted, errors.Wrap(ctx, err, op, errors.WithMsg("add oplog failed")) } } if opts.newOplogMsg != nil { msg, err := rw.newOplogMessage(ctx, DeleteOp, i) if err != nil { - return rowsDeleted, errors.Wrap(err, op, errors.WithMsg("returning oplog failed")) + return rowsDeleted, errors.Wrap(ctx, err, op, errors.WithMsg("returning oplog failed")) } *opts.newOplogMsg = *msg } @@ -608,17 +608,17 @@ func (rw *Db) Delete(ctx context.Context, i interface{}, opt ...Option) (int, er func (rw *Db) DeleteItems(ctx context.Context, deleteItems []interface{}, opt ...Option) (int, error) { const op = "db.DeleteItems" if rw.underlying == nil { - return NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing underlying db") + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing underlying db") } if len(deleteItems) == 0 { - return NoRowsAffected, errors.New(errors.InvalidParameter, op, "no interfaces to delete") + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no interfaces to delete") } opts := GetOpts(opt...) if opts.newOplogMsg != nil { - return NoRowsAffected, errors.New(errors.InvalidParameter, op, "new oplog msg (singular) is not a supported option") + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "new oplog msg (singular) is not a supported option") } if opts.withOplog && opts.newOplogMsgs != nil { - return NoRowsAffected, errors.New(errors.InvalidParameter, op, "both WithOplog and NewOplogMsgs options have been specified") + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "both WithOplog and NewOplogMsgs options have been specified") } // verify that createItems are all the same type. var foundType reflect.Type @@ -628,19 +628,19 @@ func (rw *Db) DeleteItems(ctx context.Context, deleteItems []interface{}, opt .. } currentType := reflect.TypeOf(v) if foundType != currentType { - return NoRowsAffected, errors.New(errors.InvalidParameter, op, fmt.Sprintf("items contain disparate types. item %d is not a %s", i, foundType.Name())) + return NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("items contain disparate types. item %d is not a %s", i, foundType.Name())) } } var ticket *store.Ticket if opts.withOplog { - _, err := validateOplogArgs(deleteItems[0], opts) + _, err := validateOplogArgs(ctx, deleteItems[0], opts) if err != nil { - return NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("oplog validation failed")) + return NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("oplog validation failed")) } ticket, err = rw.GetTicket(deleteItems[0]) if err != nil { - return NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } } rowsDeleted := 0 @@ -650,20 +650,20 @@ func (rw *Db) DeleteItems(ctx context.Context, deleteItems []interface{}, opt .. // relationship between Create and CreateItems). underlying := rw.underlying.Delete(item) if underlying.Error != nil { - return rowsDeleted, errors.Wrap(underlying.Error, op) + return rowsDeleted, errors.Wrap(ctx, underlying.Error, op) } rowsDeleted += int(underlying.RowsAffected) } if rowsDeleted > 0 && (opts.withOplog || opts.newOplogMsgs != nil) { if opts.withOplog { if err := rw.addOplogForItems(ctx, DeleteOp, opts, ticket, deleteItems); err != nil { - return rowsDeleted, errors.Wrap(err, op, errors.WithMsg("unable to add oplog")) + return rowsDeleted, errors.Wrap(ctx, err, op, errors.WithMsg("unable to add oplog")) } } if opts.newOplogMsgs != nil { msgs, err := rw.oplogMsgsForItems(ctx, DeleteOp, opts, deleteItems) if err != nil { - return rowsDeleted, errors.Wrap(err, op, errors.WithMsg("returning oplog msgs failed")) + return rowsDeleted, errors.Wrap(ctx, err, op, errors.WithMsg("returning oplog msgs failed")) } *opts.newOplogMsgs = append(*opts.newOplogMsgs, msgs...) } @@ -671,18 +671,18 @@ func (rw *Db) DeleteItems(ctx context.Context, deleteItems []interface{}, opt .. return rowsDeleted, nil } -func validateOplogArgs(i interface{}, opts Options) (oplog.ReplayableMessage, error) { +func validateOplogArgs(ctx context.Context, i interface{}, opts Options) (oplog.ReplayableMessage, error) { const op = "db.validateOplogArgs" oplogArgs := opts.oplogOpts if oplogArgs.wrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing wrapper") } if len(oplogArgs.metadata) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing metadata") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing metadata") } replayable, ok := i.(oplog.ReplayableMessage) if !ok { - return nil, errors.E(errors.WithOp(op), errors.WithMsg("not a replayable message")) + return nil, errors.E(ctx, errors.WithOp(op), errors.WithMsg("not a replayable message")) } return replayable, nil } @@ -690,15 +690,15 @@ func validateOplogArgs(i interface{}, opts Options) (oplog.ReplayableMessage, er func (rw *Db) getTicketFor(aggregateName string) (*store.Ticket, error) { const op = "db.getTicketFor" if rw.underlying == nil { - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("%s: underlying db missing", aggregateName)) + return nil, errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("%s: underlying db missing", aggregateName)) } ticketer, err := oplog.NewGormTicketer(rw.underlying, oplog.WithAggregateNames(true)) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("%s: unable to get Ticketer", aggregateName))) + return nil, errors.WrapDeprecated(err, op, errors.WithMsg(fmt.Sprintf("%s: unable to get Ticketer", aggregateName))) } ticket, err := ticketer.GetTicket(aggregateName) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("%s: unable to get ticket", aggregateName))) + return nil, errors.WrapDeprecated(err, op, errors.WithMsg(fmt.Sprintf("%s: unable to get ticket", aggregateName))) } return ticket, nil } @@ -708,14 +708,14 @@ func (rw *Db) getTicketFor(aggregateName string) (*store.Ticket, error) { func (rw *Db) GetTicket(i interface{}) (*store.Ticket, error) { const op = "db.GetTicket" if rw.underlying == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing underlying db") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing underlying db") } if isNil(i) { - return nil, errors.New(errors.InvalidParameter, op, "missing interface") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing interface") } replayable, ok := i.(oplog.ReplayableMessage) if !ok { - return nil, errors.New(errors.InvalidParameter, op, "not a replayable message") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "not a replayable message") } return rw.getTicketFor(replayable.TableName()) } @@ -723,7 +723,7 @@ func (rw *Db) GetTicket(i interface{}) (*store.Ticket, error) { func (rw *Db) oplogMsgsForItems(ctx context.Context, opType OpType, opts Options, items []interface{}) ([]*oplog.Message, error) { const op = "db.oplogMsgsForItems" if len(items) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing items") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing items") } oplogMsgs := []*oplog.Message{} var foundType reflect.Type @@ -733,11 +733,11 @@ func (rw *Db) oplogMsgsForItems(ctx context.Context, opType OpType, opts Options } currentType := reflect.TypeOf(item) if foundType != currentType { - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("items contains disparate types. item (%d) %s is not a %s", i, currentType, foundType)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("items contains disparate types. item (%d) %s is not a %s", i, currentType, foundType)) } msg, err := rw.newOplogMessage(ctx, opType, item, WithFieldMaskPaths(opts.WithFieldMaskPaths), WithNullPaths(opts.WithNullPaths)) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } oplogMsgs = append(oplogMsgs, msg) } @@ -751,30 +751,30 @@ func (rw *Db) addOplogForItems(ctx context.Context, opType OpType, opts Options, const op = "db.addOplogForItems" oplogArgs := opts.oplogOpts if ticket == nil { - return errors.New(errors.InvalidParameter, op, "missing ticket") + return errors.New(ctx, errors.InvalidParameter, op, "missing ticket") } if len(items) == 0 { - return errors.New(errors.InvalidParameter, op, "missing items") + return errors.New(ctx, errors.InvalidParameter, op, "missing items") } if oplogArgs.metadata == nil { - return errors.New(errors.InvalidParameter, op, "missing metadata") + return errors.New(ctx, errors.InvalidParameter, op, "missing metadata") } if oplogArgs.wrapper == nil { - return errors.New(errors.InvalidParameter, op, "missing wrapper") + return errors.New(ctx, errors.InvalidParameter, op, "missing wrapper") } oplogMsgs, err := rw.oplogMsgsForItems(ctx, opType, opts, items) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } - replayable, err := validateOplogArgs(items[0], opts) + replayable, err := validateOplogArgs(ctx, items[0], opts) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("oplog validation failed")) + return errors.Wrap(ctx, err, op, errors.WithMsg("oplog validation failed")) } ticketer, err := oplog.NewGormTicketer(rw.underlying, oplog.WithAggregateNames(true)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get Ticketer")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get Ticketer")) } entry, err := oplog.NewEntry( replayable.TableName(), @@ -783,7 +783,7 @@ func (rw *Db) addOplogForItems(ctx context.Context, opType OpType, opts Options, ticketer, ) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to create oplog entry")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to create oplog entry")) } if err := entry.WriteEntryWith( ctx, @@ -791,7 +791,7 @@ func (rw *Db) addOplogForItems(ctx context.Context, opType OpType, opts Options, ticket, oplogMsgs..., ); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog entry")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog entry")) } return nil } @@ -799,16 +799,16 @@ func (rw *Db) addOplogForItems(ctx context.Context, opType OpType, opts Options, func (rw *Db) addOplog(ctx context.Context, opType OpType, opts Options, ticket *store.Ticket, i interface{}) error { const op = "db.addOplog" oplogArgs := opts.oplogOpts - replayable, err := validateOplogArgs(i, opts) + replayable, err := validateOplogArgs(ctx, i, opts) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if ticket == nil { - return errors.New(errors.InvalidParameter, op, "missing ticket") + return errors.New(ctx, errors.InvalidParameter, op, "missing ticket") } ticketer, err := oplog.NewGormTicketer(rw.underlying, oplog.WithAggregateNames(true)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get Ticketer")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get Ticketer")) } entry, err := oplog.NewEntry( replayable.TableName(), @@ -817,11 +817,11 @@ func (rw *Db) addOplog(ctx context.Context, opType OpType, opts Options, ticket ticketer, ) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } msg, err := rw.newOplogMessage(ctx, opType, i, WithFieldMaskPaths(opts.WithFieldMaskPaths), WithNullPaths(opts.WithNullPaths)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } err = entry.WriteEntryWith( ctx, @@ -830,7 +830,7 @@ func (rw *Db) addOplog(ctx context.Context, opType OpType, opts Options, ticket msg, ) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog entry")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog entry")) } return nil } @@ -840,24 +840,24 @@ func (rw *Db) addOplog(ctx context.Context, opType OpType, opts Options, ticket func (rw *Db) WriteOplogEntryWith(ctx context.Context, wrapper wrapping.Wrapper, ticket *store.Ticket, metadata oplog.Metadata, msgs []*oplog.Message, _ ...Option) error { const op = "db.WriteOplogEntryWith" if wrapper == nil { - return errors.New(errors.InvalidParameter, op, "missing wrapper") + return errors.New(ctx, errors.InvalidParameter, op, "missing wrapper") } if ticket == nil { - return errors.New(errors.InvalidParameter, op, "missing ticket") + return errors.New(ctx, errors.InvalidParameter, op, "missing ticket") } if len(msgs) == 0 { - return errors.New(errors.InvalidParameter, op, "missing msgs") + return errors.New(ctx, errors.InvalidParameter, op, "missing msgs") } if rw.underlying == nil { - return errors.New(errors.InvalidParameter, op, "missing underlying db") + return errors.New(ctx, errors.InvalidParameter, op, "missing underlying db") } if len(metadata) == 0 { - return errors.New(errors.InvalidParameter, op, "missing metadata") + return errors.New(ctx, errors.InvalidParameter, op, "missing metadata") } ticketer, err := oplog.NewGormTicketer(rw.underlying, oplog.WithAggregateNames(true)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get Ticketer")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get Ticketer")) } entry, err := oplog.NewEntry( @@ -867,7 +867,7 @@ func (rw *Db) WriteOplogEntryWith(ctx context.Context, wrapper wrapping.Wrapper, ticketer, ) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to create oplog entry")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to create oplog entry")) } err = entry.WriteEntryWith( ctx, @@ -876,17 +876,17 @@ func (rw *Db) WriteOplogEntryWith(ctx context.Context, wrapper wrapping.Wrapper, msgs..., ) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog entry")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog entry")) } return nil } -func (rw *Db) newOplogMessage(_ context.Context, opType OpType, i interface{}, opt ...Option) (*oplog.Message, error) { +func (rw *Db) newOplogMessage(ctx context.Context, opType OpType, i interface{}, opt ...Option) (*oplog.Message, error) { const op = "db.newOplogMessage" opts := GetOpts(opt...) replayable, ok := i.(oplog.ReplayableMessage) if !ok { - return nil, errors.New(errors.InvalidParameter, op, "not a replayable interface") + return nil, errors.New(ctx, errors.InvalidParameter, op, "not a replayable interface") } msg := oplog.Message{ Message: i.(proto.Message), @@ -902,7 +902,7 @@ func (rw *Db) newOplogMessage(_ context.Context, opType OpType, i interface{}, o case DeleteOp: msg.OpType = oplog.OpType_OP_TYPE_DELETE default: - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("operation type %v is not supported", opType)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("operation type %v is not supported", opType)) } return &msg, nil } @@ -914,12 +914,12 @@ func (rw *Db) newOplogMessage(_ context.Context, opType OpType, i interface{}, o func (w *Db) DoTx(ctx context.Context, retries uint, backOff Backoff, Handler TxHandler) (RetryInfo, error) { const op = "db.DoTx" if w.underlying == nil { - return RetryInfo{}, errors.New(errors.InvalidParameter, op, "missing underlying db") + return RetryInfo{}, errors.New(ctx, errors.InvalidParameter, op, "missing underlying db") } info := RetryInfo{} for attempts := uint(1); ; attempts++ { if attempts > retries+1 { - return info, errors.New(errors.MaxRetries, op, fmt.Sprintf("Too many retries: %d of %d", attempts-1, retries+1)) + return info, errors.New(ctx, errors.MaxRetries, op, fmt.Sprintf("Too many retries: %d of %d", attempts-1, retries+1)) } // step one of this, start a transaction... @@ -928,7 +928,7 @@ func (w *Db) DoTx(ctx context.Context, retries uint, backOff Backoff, Handler Tx rw := &Db{newTx} if err := Handler(rw, rw); err != nil { if err := newTx.Rollback().Error; err != nil { - return info, errors.Wrap(err, op) + return info, errors.Wrap(ctx, err, op) } if errors.Match(errors.T(errors.TicketAlreadyRedeemed), err) { d := backOff.Duration(attempts) @@ -937,14 +937,14 @@ func (w *Db) DoTx(ctx context.Context, retries uint, backOff Backoff, Handler Tx time.Sleep(d) continue } - return info, errors.Wrap(err, op) + return info, errors.Wrap(ctx, err, op, errors.WithoutEvent()) } if err := newTx.Commit().Error; err != nil { if err := newTx.Rollback().Error; err != nil { - return info, errors.Wrap(err, op) + return info, errors.Wrap(ctx, err, op) } - return info, errors.Wrap(err, op) + return info, errors.Wrap(ctx, err, op) } return info, nil // it all worked!!! } @@ -952,28 +952,28 @@ func (w *Db) DoTx(ctx context.Context, retries uint, backOff Backoff, Handler Tx // LookupByPublicId will lookup resource by its public_id or private_id, which // must be unique. Options are ignored. -func (rw *Db) LookupById(_ context.Context, resourceWithIder interface{}, _ ...Option) error { +func (rw *Db) LookupById(ctx context.Context, resourceWithIder interface{}, _ ...Option) error { const op = "db.LookupById" if rw.underlying == nil { - return errors.New(errors.InvalidParameter, op, "missing underlying db") + return errors.New(ctx, errors.InvalidParameter, op, "missing underlying db") } if reflect.ValueOf(resourceWithIder).Kind() != reflect.Ptr { - return errors.New(errors.InvalidParameter, op, "interface parameter must to be a pointer") + return errors.New(ctx, errors.InvalidParameter, op, "interface parameter must to be a pointer") } - primaryKey, where, err := primaryKeyWhere(resourceWithIder) + primaryKey, where, err := primaryKeyWhere(ctx, resourceWithIder) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if err := rw.underlying.Where(where, primaryKey).First(resourceWithIder).Error; err != nil { if err == gorm.ErrRecordNotFound { - return errors.E(errors.WithCode(errors.RecordNotFound), errors.WithOp(op)) + return errors.E(ctx, errors.WithCode(errors.RecordNotFound), errors.WithOp(op)) } - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } -func primaryKeyWhere(resourceWithIder interface{}) (pkey string, w string, e error) { +func primaryKeyWhere(ctx context.Context, resourceWithIder interface{}) (pkey string, w string, e error) { const op = "db.primaryKeyWhere" var primaryKey, where string switch resourceType := resourceWithIder.(type) { @@ -984,10 +984,10 @@ func primaryKeyWhere(resourceWithIder interface{}) (pkey string, w string, e err primaryKey = resourceType.GetPrivateId() where = "private_id = ?" default: - return "", "", errors.New(errors.InvalidParameter, op, fmt.Sprintf("unsupported interface type %T", resourceWithIder)) + return "", "", errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("unsupported interface type %T", resourceWithIder)) } if primaryKey == "" { - return "", "", errors.New(errors.InvalidParameter, op, "missing primary key") + return "", "", errors.New(ctx, errors.InvalidParameter, op, "missing primary key") } return primaryKey, where, nil } @@ -999,19 +999,19 @@ func (rw *Db) LookupByPublicId(ctx context.Context, resource ResourcePublicIder, } // LookupWhere will lookup the first resource using a where clause with parameters (it only returns the first one) -func (rw *Db) LookupWhere(_ context.Context, resource interface{}, where string, args ...interface{}) error { +func (rw *Db) LookupWhere(ctx context.Context, resource interface{}, where string, args ...interface{}) error { const op = "db.LookupWhere" if rw.underlying == nil { - return errors.New(errors.InvalidParameter, op, "missing underlying db") + return errors.New(ctx, errors.InvalidParameter, op, "missing underlying db") } if reflect.ValueOf(resource).Kind() != reflect.Ptr { - return errors.New(errors.InvalidParameter, op, "interface parameter must to be a pointer") + return errors.New(ctx, errors.InvalidParameter, op, "interface parameter must to be a pointer") } if err := rw.underlying.Where(where, args...).First(resource).Error; err != nil { if err == gorm.ErrRecordNotFound { - return errors.E(errors.WithCode(errors.RecordNotFound), errors.WithOp(op)) + return errors.E(ctx, errors.WithCode(errors.RecordNotFound), errors.WithOp(op)) } - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -1023,17 +1023,17 @@ func (rw *Db) LookupWhere(_ context.Context, resource interface{}, where string, // Supports the WithLimit option. If WithLimit < 0, then unlimited results are returned. // If WithLimit == 0, then default limits are used for results. // Supports the WithOrder option. -func (rw *Db) SearchWhere(_ context.Context, resources interface{}, where string, args []interface{}, opt ...Option) error { +func (rw *Db) SearchWhere(ctx context.Context, resources interface{}, where string, args []interface{}, opt ...Option) error { const op = "db.SearchWhere" opts := GetOpts(opt...) if rw.underlying == nil { - return errors.New(errors.InvalidParameter, op, "missing underlying db") + return errors.New(ctx, errors.InvalidParameter, op, "missing underlying db") } if where == "" && len(args) > 0 { - return errors.New(errors.InvalidParameter, op, "args provided with empty where") + return errors.New(ctx, errors.InvalidParameter, op, "args provided with empty where") } if reflect.ValueOf(resources).Kind() != reflect.Ptr { - return errors.New(errors.InvalidParameter, op, "interface parameter must to be a pointer") + return errors.New(ctx, errors.InvalidParameter, op, "interface parameter must to be a pointer") } var err error db := rw.underlying.Order(opts.withOrder) @@ -1055,7 +1055,7 @@ func (rw *Db) SearchWhere(_ context.Context, resources interface{}, where string err = db.Find(resources).Error if err != nil { // searching with a slice parameter does not return a gorm.ErrRecordNotFound - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -1127,11 +1127,11 @@ func Clear(i interface{}, fields []string, depth int) error { switch v.Kind() { case reflect.Ptr: if v.IsNil() || v.Elem().Kind() != reflect.Struct { - return errors.E(errors.WithCode(errors.InvalidParameter), errors.WithOp(op)) + return errors.EDeprecated(errors.WithCode(errors.InvalidParameter), errors.WithOp(op), errors.WithoutEvent()) } clear(v, fm, depth) default: - return errors.E(errors.WithCode(errors.InvalidParameter), errors.WithOp(op)) + return errors.EDeprecated(errors.WithCode(errors.InvalidParameter), errors.WithOp(op), errors.WithoutEvent()) } return nil } diff --git a/internal/db/read_writer_test.go b/internal/db/read_writer_test.go index 545c6d165..8f7a615ae 100644 --- a/internal/db/read_writer_test.go +++ b/internal/db/read_writer_test.go @@ -1066,6 +1066,7 @@ func TestDb_Exec(t *testing.T) { func TestDb_DoTx(t *testing.T) { t.Parallel() + ctx := context.TODO() db, _ := TestSetup(t, "postgres") t.Run("valid-with-10-retries", func(t *testing.T) { assert, require := assert.New(t), require.New(t) @@ -1075,7 +1076,7 @@ func TestDb_DoTx(t *testing.T) { func(Reader, Writer) error { attempts += 1 if attempts < 9 { - return errors.E(errors.WithCode(errors.TicketAlreadyRedeemed)) + return errors.E(ctx, errors.WithCode(errors.TicketAlreadyRedeemed)) } return nil }) @@ -1091,7 +1092,7 @@ func TestDb_DoTx(t *testing.T) { func(Reader, Writer) error { attempts += 1 if attempts < 2 { - return errors.E(errors.WithCode(errors.TicketAlreadyRedeemed)) + return errors.E(ctx, errors.WithCode(errors.TicketAlreadyRedeemed)) } return nil }) @@ -1107,7 +1108,7 @@ func TestDb_DoTx(t *testing.T) { func(Reader, Writer) error { attempts += 1 if attempts < 3 { - return errors.E(errors.WithCode(errors.TicketAlreadyRedeemed)) + return errors.E(ctx, errors.WithCode(errors.TicketAlreadyRedeemed)) } return nil }) @@ -1123,7 +1124,7 @@ func TestDb_DoTx(t *testing.T) { func(Reader, Writer) error { attempts += 1 if attempts < 4 { - return errors.E(errors.WithCode(errors.TicketAlreadyRedeemed)) + return errors.E(ctx, errors.WithCode(errors.TicketAlreadyRedeemed)) } return nil }) @@ -1163,7 +1164,7 @@ func TestDb_DoTx(t *testing.T) { attempts := 0 got, err := w.DoTx(context.Background(), 2, ExpBackoff{}, func(Reader, Writer) error { attempts += 1 - return errors.E(errors.WithCode(errors.TicketAlreadyRedeemed)) + return errors.E(ctx, errors.WithCode(errors.TicketAlreadyRedeemed)) }) require.Error(err) assert.Equal(3, got.Retries) diff --git a/internal/db/schema/manager.go b/internal/db/schema/manager.go index 196b9c448..6cc1c313b 100644 --- a/internal/db/schema/manager.go +++ b/internal/db/schema/manager.go @@ -63,10 +63,10 @@ func NewManager(ctx context.Context, dialect string, db *sql.DB, opt ...Option) var err error dbM.driver, err = postgres.New(ctx, db) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } default: - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("unknown dialect %q", dialect)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("unknown dialect %q", dialect)) } return &dbM, nil } @@ -92,7 +92,7 @@ func (b *Manager) CurrentState(ctx context.Context) (*State, error) { v, initialized, dirty, err := b.driver.CurrentState(ctx) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } dbS.InitializationStarted = initialized dbS.DatabaseSchemaVersion = v @@ -106,7 +106,7 @@ func (b *Manager) CurrentState(ctx context.Context) (*State, error) { func (b *Manager) SharedLock(ctx context.Context) error { const op = "schema.(Manager).SharedLock" if err := b.driver.TrySharedLock(ctx); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -117,7 +117,7 @@ func (b *Manager) SharedLock(ctx context.Context) error { func (b *Manager) SharedUnlock(ctx context.Context) error { const op = "schema.(Manager).SharedUnlock" if err := b.driver.UnlockShared(ctx); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -127,7 +127,7 @@ func (b *Manager) SharedUnlock(ctx context.Context) error { func (b *Manager) ExclusiveLock(ctx context.Context) error { const op = "schema.(Manager).ExclusiveLock" if err := b.driver.TryLock(ctx); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -138,7 +138,7 @@ func (b *Manager) ExclusiveLock(ctx context.Context) error { func (b *Manager) ExclusiveUnlock(ctx context.Context) error { const op = "schema.(Manager).ExclusiveUnlock" if err := b.driver.Unlock(ctx); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -151,27 +151,27 @@ func (b *Manager) RollForward(ctx context.Context) error { // Capturing a lock that this session to the db already possesses is okay. if err := b.driver.Lock(ctx); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } defer func() { if err := b.driver.Unlock(ctx); err != nil { // I'm not sure this is ideal, but we have to rollback the current // transaction if we're unable to release the lock - panic(errors.Wrap(err, op)) + panic(errors.Wrap(ctx, err, op)) } }() curVersion, _, dirty, err := b.driver.CurrentState(ctx) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if dirty { - return errors.New(errors.NotSpecificIntegrity, op, fmt.Sprintf("schema is dirty with version %d", curVersion)) + return errors.New(ctx, errors.NotSpecificIntegrity, op, fmt.Sprintf("schema is dirty with version %d", curVersion)) } if err = b.runMigrations(ctx, newStatementProvider(b.dialect, curVersion, WithMigrationStates(b.migrationStates))); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -187,10 +187,10 @@ func (b *Manager) runMigrations(ctx context.Context, qp *statementProvider) erro const op = "schema.(Manager).runMigrations" if err := b.driver.StartRun(ctx); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if err := b.driver.EnsureVersionTable(ctx); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } for qp.Next() { select { @@ -201,16 +201,16 @@ func (b *Manager) runMigrations(ctx context.Context, qp *statementProvider) erro err = multierror.Append(err, rbErr) } } - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) default: // context is not done yet. Continue on to the next query to execute. } if err := b.driver.Run(ctx, bytes.NewReader(qp.ReadUp()), qp.Version()); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } } if err := b.driver.CommitRun(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -230,11 +230,11 @@ func GetMigrationLog(ctx context.Context, d *sql.DB, opt ...Option) ([]LogEntry, const op = "schema.GetMigrationLog" const sql = "select id, create_time, migration_version, entry from log_migration where migration_version in (select max(version) from boundary_schema_version)" if d == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing sql db") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing sql db") } rows, err := d.QueryContext(ctx, sql) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } defer rows.Close() @@ -242,19 +242,19 @@ func GetMigrationLog(ctx context.Context, d *sql.DB, opt ...Option) ([]LogEntry, for rows.Next() { var e LogEntry if err := rows.Scan(&e.Id, &e.CreateTime, &e.MigrationVersion, &e.Entry); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } entries = append(entries, e) } if rows.Err() != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } opts := getOpts(opt...) if opts.withDeleteLog { // this truncate could change to a delete if FKs are needed in the future _, err = d.ExecContext(ctx, "truncate log_migration") if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } } return entries, nil diff --git a/internal/db/schema/migrations/postgres/2/10_auth_test.go b/internal/db/schema/migrations/postgres/2/10_auth_test.go index 39c5ae2c0..8d7fc74b4 100644 --- a/internal/db/schema/migrations/postgres/2/10_auth_test.go +++ b/internal/db/schema/migrations/postgres/2/10_auth_test.go @@ -24,11 +24,11 @@ func Test_AuthMethodSubtypes(t *testing.T) { kmsCache := kms.TestKms(t, conn, rootWrapper) iamRepo := iam.TestRepo(t, conn, rootWrapper) org, _ := iam.TestScopes(t, iamRepo) - oidcRepo, err := oidc.NewRepository(rw, rw, kmsCache) + oidcRepo, err := oidc.NewRepository(ctx, rw, rw, kmsCache) require.NoError(err) // test oidc subtype insert - oidcAm, err := oidc.NewAuthMethod(org.PublicId, "alice-rp", "fido", oidc.WithName("alice")) + oidcAm, err := oidc.NewAuthMethod(ctx, org.PublicId, "alice-rp", "fido", oidc.WithName("alice")) require.NoError(err) oidcAm, err = oidcRepo.CreateAuthMethod(ctx, oidcAm) require.NoError(err) diff --git a/internal/db/schema/postgres/postgres.go b/internal/db/schema/postgres/postgres.go index 69ed9c72d..1c30af45e 100644 --- a/internal/db/schema/postgres/postgres.go +++ b/internal/db/schema/postgres/postgres.go @@ -66,11 +66,11 @@ type Postgres struct { func New(ctx context.Context, instance *sql.DB) (*Postgres, error) { const op = "postgres.New" if err := instance.PingContext(ctx); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } conn, err := instance.Conn(ctx) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } px := &Postgres{ @@ -87,14 +87,14 @@ func (p *Postgres) TrySharedLock(ctx context.Context) error { const query = "select pg_try_advisory_lock_shared($1)" r := p.conn.QueryRowContext(ctx, query, schemaAccessLockId) if r.Err() != nil { - return errors.Wrap(r.Err(), op) + return errors.Wrap(ctx, r.Err(), op) } var gotLock bool if err := r.Scan(&gotLock); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if !gotLock { - return errors.New(errors.MigrationLock, op, "Lock failed") + return errors.New(ctx, errors.MigrationLock, op, "Lock failed") } return nil } @@ -106,14 +106,14 @@ func (p *Postgres) TryLock(ctx context.Context) error { const query = "select pg_try_advisory_lock($1)" r := p.conn.QueryRowContext(ctx, query, schemaAccessLockId) if r.Err() != nil { - return errors.Wrap(r.Err(), op) + return errors.Wrap(ctx, r.Err(), op) } var gotLock bool if err := r.Scan(&gotLock); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if !gotLock { - return errors.New(errors.MigrationLock, op, "Lock failed") + return errors.New(ctx, errors.MigrationLock, op, "Lock failed") } return nil } @@ -124,7 +124,7 @@ func (p *Postgres) Lock(ctx context.Context) error { const op = "postgres.(Postgres).Lock" const query = "select pg_advisory_lock($1)" if _, err := p.conn.ExecContext(ctx, query, schemaAccessLockId); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -135,7 +135,7 @@ func (p *Postgres) Unlock(ctx context.Context) error { const op = "postgres.(Postgres).Unlock" const query = `select pg_advisory_unlock($1)` if _, err := p.conn.ExecContext(ctx, query, schemaAccessLockId); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -146,7 +146,7 @@ func (p *Postgres) UnlockShared(ctx context.Context) error { const op = "postgres.(Postgres).UnlockShared" query := `select pg_advisory_unlock_shared($1)` if _, err := p.conn.ExecContext(ctx, query, schemaAccessLockId); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -159,10 +159,10 @@ func (p *Postgres) Rollback() error { p.tx = nil }() if p.tx == nil { - return errors.New(errors.MigrationIntegrity, op, "no pending transaction") + return errors.NewDeprecated(errors.MigrationIntegrity, op, "no pending transaction") } if err := p.tx.Rollback(); err != nil { - return errors.Wrap(err, op) + return errors.WrapDeprecated(err, op) } return nil } @@ -184,13 +184,13 @@ func (p *Postgres) CommitRun() error { p.tx = nil }() if p.tx == nil { - return errors.New(errors.MigrationIntegrity, op, "no pending transaction") + return errors.NewDeprecated(errors.MigrationIntegrity, op, "no pending transaction") } if err := p.tx.Commit(); err != nil { if errRollback := p.tx.Rollback(); errRollback != nil { err = multierror.Append(err, errRollback) } - return errors.Wrap(err, op) + return errors.WrapDeprecated(err, op) } return nil } @@ -207,7 +207,7 @@ func (p *Postgres) Run(ctx context.Context, migration io.Reader, version int) er const op = "postgres.(Postgres).Run" migr, err := ioutil.ReadAll(migration) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } // Run migration query := string(migr) @@ -225,7 +225,7 @@ func (p *Postgres) Run(ctx context.Context, migration io.Reader, version int) er // set the version first, so logs will be associated with this new version. // if there's an error, it will get rollback if err := p.setVersion(ctx, version, false); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if _, err := extr.ExecContext(ctx, query); err != nil { @@ -249,9 +249,9 @@ func (p *Postgres) Run(ctx context.Context, migration io.Reader, version int) er message = fmt.Sprintf("%s, %s", message, pgErr.Detail) } message = fmt.Sprintf("%s, on line %v: %s", message, line, migr) - return errors.Wrap(err, op, errors.WithMsg(message)) + return errors.Wrap(ctx, err, op, errors.WithMsg(message)) } - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("migration failed: %s", migr))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("migration failed: %s", migr))) } return nil @@ -314,7 +314,7 @@ func (p *Postgres) setVersion(ctx context.Context, version int, dirty bool) erro if errRollback := rollback(); errRollback != nil { err = multierror.Append(err, errRollback) } - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } // Also re-write the schema Version for nil dirty versions to prevent @@ -327,13 +327,13 @@ func (p *Postgres) setVersion(ctx context.Context, version int, dirty bool) erro if errRollback := rollback(); errRollback != nil { err = multierror.Append(err, errRollback) } - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } } if p.tx == nil { if err := tx.Commit(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } } return nil @@ -351,7 +351,7 @@ func (p *Postgres) CurrentState(ctx context.Context) (version int, previouslyRan tableQuery := `select table_name from information_schema.tables where table_schema=(select current_schema()) and table_name in ('schema_migrations', '` + defaultMigrationsTable + `')` tableResult, err := p.conn.QueryContext(ctx, tableQuery) if err != nil { - return nilVersion, previouslyRan, dirty, errors.Wrap(err, op) + return nilVersion, previouslyRan, dirty, errors.Wrap(ctx, err, op) } defer tableResult.Close() if !tableResult.Next() { @@ -361,17 +361,17 @@ func (p *Postgres) CurrentState(ctx context.Context) (version int, previouslyRan tableName := defaultMigrationsTable if err := tableResult.Scan(&tableName); err != nil { - return nilVersion, previouslyRan, dirty, errors.Wrap(err, op) + return nilVersion, previouslyRan, dirty, errors.Wrap(ctx, err, op) } previouslyRan = true if tableResult.Next() { - return nilVersion, previouslyRan, dirty, errors.New(errors.MigrationIntegrity, op, "both old and new migration tables exist") + return nilVersion, previouslyRan, dirty, errors.New(ctx, errors.MigrationIntegrity, op, "both old and new migration tables exist") } query := `select version, dirty from ` + pq.QuoteIdentifier(tableName) results, err := p.conn.QueryContext(ctx, query) if err != nil { - return nilVersion, previouslyRan, dirty, errors.Wrap(err, op) + return nilVersion, previouslyRan, dirty, errors.Wrap(ctx, err, op) } defer results.Close() if !results.Next() { @@ -379,10 +379,10 @@ func (p *Postgres) CurrentState(ctx context.Context) (version int, previouslyRan return nilVersion, previouslyRan, dirty, nil } if err := results.Scan(&version, &dirty); err != nil { - return nilVersion, previouslyRan, dirty, errors.Wrap(err, op) + return nilVersion, previouslyRan, dirty, errors.Wrap(ctx, err, op) } if results.Next() { - return nilVersion, previouslyRan, dirty, errors.New(errors.MigrationIntegrity, op, "to many versions in version table") + return nilVersion, previouslyRan, dirty, errors.New(ctx, errors.MigrationIntegrity, op, "to many versions in version table") } return version, previouslyRan, dirty, nil } @@ -393,12 +393,12 @@ func (p *Postgres) drop(ctx context.Context) (err error) { query := `select table_name from information_schema.tables where table_schema=(select current_schema()) and table_type='BASE TABLE'` tables, err := p.conn.QueryContext(ctx, query) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } defer func() { if errClose := tables.Close(); errClose != nil { err = multierror.Append(err, errClose) - err = errors.Wrap(err, op) + err = errors.Wrap(ctx, err, op) } }() @@ -407,14 +407,14 @@ func (p *Postgres) drop(ctx context.Context) (err error) { for tables.Next() { var tableName string if err := tables.Scan(&tableName); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if len(tableName) > 0 { tableNames = append(tableNames, tableName) } } if err := tables.Err(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if len(tableNames) > 0 { @@ -422,7 +422,7 @@ func (p *Postgres) drop(ctx context.Context) (err error) { for _, t := range tableNames { query = `drop table if exists ` + pq.QuoteIdentifier(t) + ` cascade` if _, err := p.conn.ExecContext(ctx, query); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } } } @@ -450,7 +450,7 @@ func (p *Postgres) EnsureVersionTable(ctx context.Context) (err error) { if wpErr := rollback(); wpErr != nil { err = multierror.Append(err, wpErr) } - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if exists { return nil @@ -461,7 +461,7 @@ func (p *Postgres) EnsureVersionTable(ctx context.Context) (err error) { if wpErr := rollback(); wpErr != nil { err = multierror.Append(err, wpErr) } - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } createStmt := `create table if not exists ` + pq.QuoteIdentifier(defaultMigrationsTable) + ` (version bigint primary key, dirty boolean not null)` @@ -469,7 +469,7 @@ func (p *Postgres) EnsureVersionTable(ctx context.Context) (err error) { if wpErr := rollback(); wpErr != nil { err = multierror.Append(err, wpErr) } - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil diff --git a/internal/db/schema/schema.go b/internal/db/schema/schema.go index 9e1d53225..f300c7308 100644 --- a/internal/db/schema/schema.go +++ b/internal/db/schema/schema.go @@ -15,20 +15,20 @@ func MigrateStore(ctx context.Context, dialect string, url string, opt ...Option d, err := sql.Open(dialect, url) if err != nil { - return false, errors.Wrap(err, op) + return false, errors.Wrap(ctx, err, op) } sMan, err := NewManager(ctx, dialect, d, opt...) if err != nil { - return false, errors.Wrap(err, op) + return false, errors.Wrap(ctx, err, op) } st, err := sMan.CurrentState(ctx) if err != nil { - return false, errors.Wrap(err, op) + return false, errors.Wrap(ctx, err, op) } if st.Dirty { - return false, errors.New(errors.MigrationIntegrity, op, "db marked dirty") + return false, errors.New(ctx, errors.MigrationIntegrity, op, "db marked dirty") } if st.InitializationStarted && st.DatabaseSchemaVersion == st.BinarySchemaVersion { @@ -36,7 +36,7 @@ func MigrateStore(ctx context.Context, dialect string, url string, opt ...Option } if err := sMan.RollForward(ctx); err != nil { - return false, errors.Wrap(err, op) + return false, errors.Wrap(ctx, err, op) } return true, nil diff --git a/internal/errors/error.go b/internal/errors/error.go index 3bab1f2e7..7944381cc 100644 --- a/internal/errors/error.go +++ b/internal/errors/error.go @@ -1,10 +1,13 @@ package errors import ( + "context" "errors" "fmt" + "runtime" "strings" + "github.com/hashicorp/boundary/internal/observability/event" "github.com/lib/pq" ) @@ -35,6 +38,9 @@ type Err struct { // E creates a new Err with provided code and supports the options of: // +// * WithoutEvent - allows you to specify that an error event should not be +// emitted. +// // * WithOp() - allows you to specify an optional Op (operation). // // * WithMsg() - allows you to specify an optional error msg, if the default @@ -46,7 +52,8 @@ type Err struct { // // * WithCode() - allows you to specify an optional Code, this code will be prioritized // over a code used from WithWrap(). -func E(opt ...Option) error { +func E(ctx context.Context, opt ...Option) error { + // nil ctx is allowed and tested for in unit tests opts := GetOpts(opt...) var code Code @@ -62,19 +69,55 @@ func E(opt ...Option) error { code = opts.withCode } - return &Err{ + err = &Err{ Code: code, Op: opts.withOp, Wrapped: opts.withErrWrapped, Msg: opts.withErrMsg, } + if opts.withoutEvent { + return err + } + + { + // events require an Op, but we don't want to change the error specified + // by the caller. So we'll build a new event and conditionally set a + // reasonable Op based on the call stack. + eventErr := &Err{ + Code: err.Code, + Op: err.Op, + Wrapped: err.Wrapped, + Msg: err.Msg, + } + if eventErr.Op == "" { + const has = "github.com/hashicorp/boundary/internal/errors." + const trim = "github.com/hashicorp/boundary/" + for i := 0; i < 5; i++ { + pc, _, _, ok := runtime.Caller(i) + details := runtime.FuncForPC(pc) + if ok && details != nil { + if strings.HasPrefix(details.Name(), has) { + continue + } + eventErr.Op = Op(strings.TrimPrefix(details.Name(), trim)) + break + } + } + if eventErr.Op == "" { + eventErr.Op = "unknown operation" + } + } + event.WriteError(ctx, event.Op(err.Op), eventErr) + } + + return err } // New creates a new Err with provided code, op and msg // It supports the options of: // // * WithWrap() - allows you to specify an error to wrap -func New(c Code, op Op, msg string, opt ...Option) error { +func New(ctx context.Context, c Code, op Op, msg string, opt ...Option) error { if c != Unknown { opt = append(opt, WithCode(c)) } @@ -84,8 +127,7 @@ func New(c Code, op Op, msg string, opt ...Option) error { if msg != "" { opt = append(opt, WithMsg(msg)) } - - return E(opt...) + return E(ctx, opt...) } // Wrap creates a new Err from the provided err and op, @@ -94,7 +136,7 @@ func New(c Code, op Op, msg string, opt ...Option) error { // // * WithMsg() - allows you to specify an optional error msg, if the default // msg for the error Code is not sufficient. -func Wrap(e error, op Op, opt ...Option) error { +func Wrap(ctx context.Context, e error, op Op, opt ...Option) error { if op != "" { opt = append(opt, WithOp(op)) } @@ -109,7 +151,31 @@ func Wrap(e error, op Op, opt ...Option) error { opt = append(opt, WithWrap(e)) } - return E(opt...) + return E(ctx, opt...) +} + +// EDeprecated is the legacy version of E which does not +// create an event. Please refrain from using this. +// When all calls are moved from EDeprecated to +// E, please update ICU-1883 +func EDeprecated(opt ...Option) error { + return E(context.TODO(), opt...) +} + +// NewDeprecated is the legacy version of New which does not +// create an event. Please refrain from using this. +// When all calls are moved from NewDeprecated to +// New, please update ICU-1883 +func NewDeprecated(c Code, op Op, msg string, opt ...Option) error { + return New(context.TODO(), c, op, msg, opt...) +} + +// WrapDeprecated is the legacy version of New which does not +// create an event. Please refrain from using this. +// When all calls are moved from WrapDeprecated to +// New, please update ICU-1884 +func WrapDeprecated(e error, op Op, opt ...Option) error { + return Wrap(context.TODO(), e, op, opt...) } // Convert will convert the error to a Boundary *Err (returning it as an error) @@ -130,24 +196,24 @@ func Convert(e error) *Err { if pqError.Code.Class() == "23" { // class of integrity constraint violations switch pqError.Code { case "23505": // unique_violation - return E(WithMsg(pqError.Message), WithWrap(E(WithCode(NotUnique), WithMsg("unique constraint violation")))).(*Err) + return E(context.TODO(), WithoutEvent(), WithMsg(pqError.Message), WithWrap(EDeprecated(WithCode(NotUnique), WithMsg("unique constraint violation")))).(*Err) case "23502": // not_null_violation msg := fmt.Sprintf("%s must not be empty", pqError.Column) - return E(WithMsg(msg), WithWrap(E(WithCode(NotNull), WithMsg("not null constraint violated")))).(*Err) + return E(context.TODO(), WithoutEvent(), WithMsg(msg), WithWrap(EDeprecated(WithCode(NotNull), WithMsg("not null constraint violated")))).(*Err) case "23514": // check_violation msg := fmt.Sprintf("%s constraint failed", pqError.Constraint) - return E(WithMsg(msg), WithWrap(E(WithCode(CheckConstraint), WithMsg("check constraint violated")))).(*Err) + return E(context.TODO(), WithoutEvent(), WithMsg(msg), WithWrap(EDeprecated(WithCode(CheckConstraint), WithMsg("check constraint violated")))).(*Err) default: - return E(WithCode(NotSpecificIntegrity), WithMsg(pqError.Message)).(*Err) + return E(context.TODO(), WithoutEvent(), WithCode(NotSpecificIntegrity), WithMsg(pqError.Message)).(*Err) } } switch pqError.Code { case "42P01": - return E(WithCode(MissingTable), WithMsg(pqError.Message)).(*Err) + return E(context.TODO(), WithoutEvent(), WithCode(MissingTable), WithMsg(pqError.Message)).(*Err) case "42703": - return E(WithCode(ColumnNotFound), WithMsg(pqError.Message)).(*Err) + return E(context.TODO(), WithoutEvent(), WithCode(ColumnNotFound), WithMsg(pqError.Message)).(*Err) case "P0001": - return E(WithCode(Exception), WithMsg(pqError.Message)).(*Err) + return E(context.TODO(), WithoutEvent(), WithCode(Exception), WithMsg(pqError.Message)).(*Err) } } // unfortunately, we can't help. diff --git a/internal/errors/error_test.go b/internal/errors/error_test.go index e90a7e07a..138ca8256 100644 --- a/internal/errors/error_test.go +++ b/internal/errors/error_test.go @@ -15,7 +15,7 @@ import ( func Test_ErrorE(t *testing.T) { t.Parallel() - errRecordNotFound := errors.E(errors.WithCode(errors.RecordNotFound)) + errRecordNotFound := errors.E(context.TODO(), errors.WithoutEvent(), errors.WithCode(errors.RecordNotFound)) tests := []struct { name string opt []errors.Option @@ -77,11 +77,24 @@ func Test_ErrorE(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - err := errors.E(tt.opt...) + err := errors.EDeprecated(tt.opt...) + require.Error(err) + assert.Equal(tt.want, err) + + err = errors.E(context.TODO(), tt.opt...) require.Error(err) assert.Equal(tt.want, err) }) } + t.Run("nil-context", func(t *testing.T) { + assert, require := assert.New(t), require.New(t) + //nolint SA1012 intentionally passing a nil context. + err := errors.E(nil, errors.WithCode(errors.InvalidParameter)) + require.Error(err) + assert.Equal(&errors.Err{ + Code: errors.InvalidParameter, + }, err) + }) } func Test_NewError(t *testing.T) { @@ -100,15 +113,25 @@ func Test_NewError(t *testing.T) { op: "alice.Bob", msg: "test msg", opt: []errors.Option{ - errors.WithWrap(errors.E(errors.WithCode(errors.RecordNotFound))), + errors.WithWrap(errors.E(context.TODO(), errors.WithoutEvent(), errors.WithCode(errors.RecordNotFound))), }, want: &errors.Err{ Op: "alice.Bob", - Wrapped: errors.E(errors.WithCode(errors.RecordNotFound)), + Wrapped: errors.E(context.TODO(), errors.WithoutEvent(), errors.WithCode(errors.RecordNotFound)), Msg: "test msg", Code: errors.InvalidParameter, }, }, + { + name: "empty-op", + code: errors.InvalidParameter, + op: "", + msg: "test msg", + want: &errors.Err{ + Msg: "test msg", + Code: errors.InvalidParameter, + }, + }, { name: "no-options", opt: nil, @@ -142,7 +165,11 @@ func Test_NewError(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - err := errors.New(tt.code, tt.op, tt.msg, tt.opt...) + err := errors.NewDeprecated(tt.code, tt.op, tt.msg, tt.opt...) + require.Error(err) + assert.Equal(tt.want, err) + + err = errors.New(context.TODO(), tt.code, tt.op, tt.msg, tt.opt...) require.Error(err) assert.Equal(tt.want, err) }) @@ -151,7 +178,7 @@ func Test_NewError(t *testing.T) { func Test_WrapError(t *testing.T) { t.Parallel() - testErr := errors.E(errors.WithCode(errors.InvalidParameter), errors.WithOp("alice.Bob"), errors.WithMsg("test msg")) + testErr := errors.E(context.TODO(), errors.WithoutEvent(), errors.WithCode(errors.InvalidParameter), errors.WithOp("alice.Bob"), errors.WithMsg("test msg")) tests := []struct { name string opt []errors.Option @@ -232,7 +259,7 @@ func Test_WrapError(t *testing.T) { Message: "test msg", }, want: &errors.Err{ - Wrapped: errors.E(errors.WithCode(errors.NotSpecificIntegrity), errors.WithMsg("test msg")), + Wrapped: errors.E(context.TODO(), errors.WithoutEvent(), errors.WithCode(errors.NotSpecificIntegrity), errors.WithMsg("test msg")), Code: errors.NotSpecificIntegrity, }, }, @@ -240,7 +267,11 @@ func Test_WrapError(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - err := errors.Wrap(tt.err, tt.op, tt.opt...) + err := errors.WrapDeprecated(tt.err, tt.op, tt.opt...) + require.Error(err) + assert.Equal(tt.want, err) + + err = errors.Wrap(context.TODO(), tt.err, tt.op, tt.opt...) require.Error(err) assert.Equal(tt.want, err) }) @@ -261,12 +292,12 @@ func TestError_Info(t *testing.T) { }, { name: "Unknown", - err: errors.E().(*errors.Err), + err: errors.E(context.TODO()).(*errors.Err), want: errors.Unknown, }, { name: "InvalidParameter", - err: errors.E(errors.WithCode(errors.InvalidParameter)).(*errors.Err), + err: errors.E(context.TODO(), errors.WithCode(errors.InvalidParameter)).(*errors.Err), want: errors.InvalidParameter, }, } @@ -287,37 +318,37 @@ func TestError_Error(t *testing.T) { }{ { name: "msg", - err: errors.E(errors.WithMsg("test msg")), + err: errors.E(context.TODO(), errors.WithoutEvent(), errors.WithMsg("test msg")), want: "test msg: unknown: error #0", }, { name: "code", - err: errors.E(errors.WithCode(errors.CheckConstraint)), + err: errors.E(context.TODO(), errors.WithoutEvent(), errors.WithCode(errors.CheckConstraint)), want: "constraint check failed, integrity violation: error #1000", }, { name: "op-msg-and-code", - err: errors.E(errors.WithCode(errors.CheckConstraint), errors.WithOp("alice.bob"), errors.WithMsg("test msg")), + err: errors.E(context.TODO(), errors.WithoutEvent(), errors.WithCode(errors.CheckConstraint), errors.WithOp("alice.bob"), errors.WithMsg("test msg")), want: "alice.bob: test msg: integrity violation: error #1000", }, { name: "unknown", - err: errors.E(), + err: errors.EDeprecated(), want: "unknown, unknown: error #0", }, { name: "wrapped-no-code", - err: errors.E(errors.WithWrap(errors.E(errors.WithCode(errors.InvalidParameter), errors.WithMsg("wrapped msg"))), errors.WithMsg("test msg")), + err: errors.E(context.TODO(), errors.WithoutEvent(), errors.WithWrap(errors.EDeprecated(errors.WithCode(errors.InvalidParameter), errors.WithMsg("wrapped msg"))), errors.WithMsg("test msg")), want: "test msg: wrapped msg: parameter violation: error #100", }, { name: "wrapped-different-error-codes", - err: errors.E(errors.WithCode(errors.CheckConstraint), errors.WithWrap(errors.E(errors.WithCode(errors.InvalidParameter), errors.WithMsg("wrapped msg"))), errors.WithMsg("test msg")), + err: errors.E(context.TODO(), errors.WithoutEvent(), errors.WithCode(errors.CheckConstraint), errors.WithWrap(errors.EDeprecated(errors.WithCode(errors.InvalidParameter), errors.WithMsg("wrapped msg"))), errors.WithMsg("test msg")), want: "test msg: integrity violation: error #1000: wrapped msg: parameter violation: error #100", }, { name: "wrapped-same-error-codes", - err: errors.E(errors.WithCode(errors.CheckConstraint), errors.WithWrap(errors.E(errors.WithCode(errors.CheckConstraint), errors.WithMsg("wrapped msg"))), errors.WithMsg("test msg")), + err: errors.E(context.TODO(), errors.WithoutEvent(), errors.WithCode(errors.CheckConstraint), errors.WithWrap(errors.EDeprecated(errors.WithCode(errors.CheckConstraint), errors.WithMsg("wrapped msg"))), errors.WithMsg("test msg")), want: "test msg: wrapped msg: integrity violation: error #1000", }, } @@ -325,7 +356,7 @@ func TestError_Error(t *testing.T) { t.Run(tt.name, func(t *testing.T) { assert := assert.New(t) got := tt.err.Error() - assert.Equal(tt.want, got) + assert.Contains(got, tt.want) }) } t.Run("nil *Err", func(t *testing.T) { @@ -338,8 +369,8 @@ func TestError_Error(t *testing.T) { func TestError_Unwrap(t *testing.T) { t.Parallel() - testErr := errors.E(errors.WithMsg("test error")) - errInvalidParameter := errors.E(errors.WithCode(errors.InvalidParameter), errors.WithMsg("test error")) + testErr := errors.EDeprecated(errors.WithMsg("test error")) + errInvalidParameter := errors.EDeprecated(errors.WithCode(errors.InvalidParameter), errors.WithMsg("test error")) tests := []struct { name string @@ -349,7 +380,7 @@ func TestError_Unwrap(t *testing.T) { }{ { name: "ErrInvalidParameter", - err: errors.E(errors.WithWrap(errInvalidParameter)), + err: errors.EDeprecated(errors.WithWrap(errInvalidParameter)), want: errInvalidParameter, wantIsErr: errInvalidParameter, }, @@ -380,7 +411,7 @@ func TestError_Unwrap(t *testing.T) { func TestConvertError(t *testing.T) { t.Parallel() - testErr := errors.E(errors.WithCode(errors.InvalidParameter), errors.WithOp("alice.Bob"), errors.WithMsg("test msg")) + testErr := errors.EDeprecated(errors.WithCode(errors.InvalidParameter), errors.WithOp("alice.Bob"), errors.WithMsg("test msg")) const ( createTable = ` create table if not exists test_table ( @@ -421,7 +452,7 @@ func TestConvertError(t *testing.T) { e: &pq.Error{ Code: pq.ErrorCode("23001"), }, - wantErr: errors.E(errors.WithCode(errors.NotSpecificIntegrity)), + wantErr: errors.EDeprecated(errors.WithCode(errors.NotSpecificIntegrity)), }, { name: "convert-domain-error", diff --git a/internal/errors/is_test.go b/internal/errors/is_test.go index 6529c5af3..ad76af9a9 100644 --- a/internal/errors/is_test.go +++ b/internal/errors/is_test.go @@ -40,12 +40,13 @@ func TestError_IsUnique(t *testing.T) { }, { name: "CodeUnique", - in: errors.E(errors.WithCode(errors.NotUnique)), + in: errors.E(context.TODO(), errors.WithCode(errors.NotUnique)), want: true, }, { name: "wrapped-pq-is-unique", in: errors.E( + context.TODO(), errors.WithWrap(&pq.Error{ Code: pq.ErrorCode("23505"), }), @@ -54,12 +55,12 @@ func TestError_IsUnique(t *testing.T) { }, { name: "RecordNotFound", - in: errors.E(errors.WithCode(errors.RecordNotFound)), + in: errors.E(context.TODO(), errors.WithCode(errors.RecordNotFound)), want: false, }, { name: "conflicting-wrapped-code", - in: errors.E(errors.WithCode(errors.NotNull), errors.WithWrap(errors.E(errors.WithCode(errors.NotUnique)))), + in: errors.E(context.TODO(), errors.WithCode(errors.NotNull), errors.WithWrap(errors.E(context.TODO(), errors.WithCode(errors.NotUnique)))), want: false, }, } @@ -102,12 +103,12 @@ func TestError_IsCheckConstraint(t *testing.T) { }, { name: "ErrCodeCheckConstraint", - in: errors.E(errors.WithCode(errors.CheckConstraint)), + in: errors.E(context.TODO(), errors.WithCode(errors.CheckConstraint)), want: true, }, { name: "wrapped-pq-is-check-constraint", - in: errors.E(errors.WithCode(errors.CheckConstraint), + in: errors.E(context.TODO(), errors.WithCode(errors.CheckConstraint), errors.WithWrap(&pq.Error{ Code: pq.ErrorCode("23514"), }), @@ -116,12 +117,12 @@ func TestError_IsCheckConstraint(t *testing.T) { }, { name: "RecordNotFound", - in: errors.E(errors.WithCode(errors.RecordNotFound)), + in: errors.E(context.TODO(), errors.WithCode(errors.RecordNotFound)), want: false, }, { name: "conflicting-wrapped-code", - in: errors.E(errors.WithCode(errors.NotNull), errors.WithWrap(errors.E(errors.WithCode(errors.CheckConstraint)))), + in: errors.E(context.TODO(), errors.WithCode(errors.NotNull), errors.WithWrap(errors.E(context.TODO(), errors.WithCode(errors.CheckConstraint)))), want: false, }, } @@ -171,12 +172,12 @@ func TestError_IsNotNullError(t *testing.T) { }, { name: "ErrCodeNotNull", - in: errors.E(errors.WithCode(errors.NotNull)), + in: errors.E(context.TODO(), errors.WithCode(errors.NotNull)), want: true, }, { name: "wrapped-pq-is-not-null", - in: errors.E(errors.WithCode(errors.NotNull), + in: errors.E(context.TODO(), errors.WithCode(errors.NotNull), errors.WithWrap(&pq.Error{ Code: pq.ErrorCode("23502"), }), @@ -185,12 +186,12 @@ func TestError_IsNotNullError(t *testing.T) { }, { name: "RecordNotFound", - in: errors.E(errors.WithCode(errors.RecordNotFound)), + in: errors.E(context.TODO(), errors.WithCode(errors.RecordNotFound)), want: false, }, { name: "conflicting-wrapped-code", - in: errors.E(errors.WithCode(errors.CheckConstraint), errors.WithWrap(errors.E(errors.WithCode(errors.NotNull)))), + in: errors.E(context.TODO(), errors.WithCode(errors.CheckConstraint), errors.WithWrap(errors.E(context.TODO(), errors.WithCode(errors.NotNull)))), want: false, }, } @@ -270,7 +271,7 @@ func TestError_IsNotFoundError(t *testing.T) { }, { name: "not-found-error", - in: errors.E(errors.WithCode(errors.RecordNotFound)), + in: errors.E(context.TODO(), errors.WithCode(errors.RecordNotFound)), want: true, }, { @@ -280,7 +281,7 @@ func TestError_IsNotFoundError(t *testing.T) { }, { name: "conflicting-wrapped-code", - in: errors.E(errors.WithCode(errors.NotNull), errors.WithWrap(errors.E(errors.WithCode(errors.RecordNotFound)))), + in: errors.E(context.TODO(), errors.WithCode(errors.NotNull), errors.WithWrap(errors.E(context.TODO(), errors.WithCode(errors.RecordNotFound)))), want: false, }, } diff --git a/internal/errors/match_test.go b/internal/errors/match_test.go index b79d6b5e0..ff1819efe 100644 --- a/internal/errors/match_test.go +++ b/internal/errors/match_test.go @@ -1,6 +1,7 @@ package errors import ( + "context" stderrors "errors" "testing" @@ -140,8 +141,8 @@ func TestTemplate_Error(t *testing.T) { func TestMatch(t *testing.T) { t.Parallel() stdErr := stderrors.New("test error") - errInvalidFieldMask := E(WithCode(InvalidFieldMask), WithMsg("test invalid field mask error")) - errNotUnique := E(WithCode(NotUnique), WithMsg("test not unique error")) + errInvalidFieldMask := E(context.TODO(), WithCode(InvalidFieldMask), WithMsg("test invalid field mask error")) + errNotUnique := E(context.TODO(), WithCode(NotUnique), WithMsg("test not unique error")) tests := []struct { name string @@ -152,7 +153,7 @@ func TestMatch(t *testing.T) { { name: "nil template", template: nil, - err: E(WithCode(NotUnique), WithMsg("this thing was must be unique")), + err: E(context.TODO(), WithCode(NotUnique), WithMsg("this thing was must be unique")), want: false, }, { @@ -164,7 +165,7 @@ func TestMatch(t *testing.T) { { name: "match on Kind only", template: T(Integrity), - err: E( + err: E(context.TODO(), WithCode(NotUnique), WithMsg("this thing must be unique"), WithOp("alice.Bob"), @@ -175,7 +176,7 @@ func TestMatch(t *testing.T) { { name: "no match on Kind only", template: T(Integrity), - err: E( + err: E(context.TODO(), WithCode(RecordNotFound), WithMsg("this thing is missing"), WithOp("alice.Bob"), @@ -186,7 +187,7 @@ func TestMatch(t *testing.T) { { name: "match on Code only", template: T(NotUnique), - err: E( + err: E(context.TODO(), WithCode(NotUnique), WithMsg("this thing must be unique"), WithOp("alice.Bob"), @@ -197,7 +198,7 @@ func TestMatch(t *testing.T) { { name: "no match on Code only", template: T(NotUnique), - err: E( + err: E(context.TODO(), WithCode(RecordNotFound), WithMsg("this thing is missing"), WithOp("alice.Bob"), @@ -208,7 +209,7 @@ func TestMatch(t *testing.T) { { name: "match on Op only", template: T(Op("alice.Bob")), - err: E( + err: E(context.TODO(), WithCode(NotUnique), WithMsg("this thing must be unique"), WithOp("alice.Bob"), @@ -219,7 +220,7 @@ func TestMatch(t *testing.T) { { name: "no match on Op only", template: T(Op("alice.Alice")), - err: E( + err: E(context.TODO(), WithCode(RecordNotFound), WithMsg("this thing is missing"), WithOp("alice.Bob"), @@ -236,7 +237,7 @@ func TestMatch(t *testing.T) { errInvalidFieldMask, Op("alice.Bob"), ), - err: E( + err: E(context.TODO(), WithCode(InvalidParameter), WithMsg("this thing must be unique"), WithOp("alice.Bob"), @@ -247,7 +248,7 @@ func TestMatch(t *testing.T) { { name: "match on Wrapped only", template: T(errInvalidFieldMask), - err: E( + err: E(context.TODO(), WithCode(NotUnique), WithMsg("this thing must be unique"), WithOp("alice.Bob"), @@ -258,7 +259,7 @@ func TestMatch(t *testing.T) { { name: "no match on Wrapped only", template: T(errNotUnique), - err: E( + err: E(context.TODO(), WithCode(RecordNotFound), WithMsg("this thing is missing"), WithOp("alice.Bob"), @@ -269,7 +270,7 @@ func TestMatch(t *testing.T) { { name: "match on Wrapped only stderror", template: T(stdErr), - err: E( + err: E(context.TODO(), WithCode(NotUnique), WithMsg("this thing must be unique"), WithOp("alice.Bob"), @@ -280,7 +281,7 @@ func TestMatch(t *testing.T) { { name: "no match on Wrapped only stderror", template: T(stderrors.New("no match")), - err: E( + err: E(context.TODO(), WithCode(RecordNotFound), WithMsg("this thing is missing"), WithOp("alice.Bob"), diff --git a/internal/errors/option.go b/internal/errors/option.go index 4d3837a15..c5b3a712e 100644 --- a/internal/errors/option.go +++ b/internal/errors/option.go @@ -18,6 +18,7 @@ type Options struct { withErrWrapped error withErrMsg string withOp Op + withoutEvent bool } func getDefaultOptions() Options { @@ -55,3 +56,9 @@ func WithCode(code Code) Option { o.withCode = code } } + +func WithoutEvent() Option { + return func(o *Options) { + o.withoutEvent = true + } +} diff --git a/internal/errors/option_test.go b/internal/errors/option_test.go index 885d07c74..3d7a0ac7e 100644 --- a/internal/errors/option_test.go +++ b/internal/errors/option_test.go @@ -1,6 +1,7 @@ package errors import ( + "context" "testing" "github.com/stretchr/testify/assert" @@ -30,7 +31,7 @@ func Test_getOpts(t *testing.T) { testOpts.withErrWrapped = nil assert.Equal(opts, testOpts) - testErr := E(WithCode(InvalidParameter), WithMsg("test error")) + testErr := E(context.TODO(), WithCode(InvalidParameter), WithMsg("test error")) // try setting it opts = GetOpts(WithWrap(testErr)) @@ -63,4 +64,17 @@ func Test_getOpts(t *testing.T) { testOpts.withCode = NotUnique assert.Equal(opts, testOpts) }) + t.Run("WithoutEvent", func(t *testing.T) { + assert := assert.New(t) + // test default + opts := GetOpts() + testOpts := getDefaultOptions() + testOpts.withoutEvent = false + assert.Equal(opts, testOpts) + + // try setting it + opts = GetOpts(WithoutEvent()) + testOpts.withoutEvent = true + assert.Equal(opts, testOpts) + }) } diff --git a/internal/host/static/host.go b/internal/host/static/host.go index 881f0d26e..b37341f9e 100644 --- a/internal/host/static/host.go +++ b/internal/host/static/host.go @@ -23,7 +23,7 @@ type Host struct { // ignored. func NewHost(catalogId string, opt ...Option) (*Host, error) { if catalogId == "" { - return nil, errors.New(errors.InvalidParameter, "static.NewHost", "no catalog id") + return nil, errors.NewDeprecated(errors.InvalidParameter, "static.NewHost", "no catalog id") } opts := getOpts(opt...) diff --git a/internal/host/static/host_catalog.go b/internal/host/static/host_catalog.go index 0651d72c6..28a38d226 100644 --- a/internal/host/static/host_catalog.go +++ b/internal/host/static/host_catalog.go @@ -19,7 +19,7 @@ type HostCatalog struct { // ignored. func NewHostCatalog(scopeId string, opt ...Option) (*HostCatalog, error) { if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, "static.NewHostCatalog", "no scope id") + return nil, errors.NewDeprecated(errors.InvalidParameter, "static.NewHostCatalog", "no scope id") } opts := getOpts(opt...) diff --git a/internal/host/static/host_set.go b/internal/host/static/host_set.go index 27b7579ce..ace7f5510 100644 --- a/internal/host/static/host_set.go +++ b/internal/host/static/host_set.go @@ -18,7 +18,7 @@ type HostSet struct { // ignored. func NewHostSet(catalogId string, opt ...Option) (*HostSet, error) { if catalogId == "" { - return nil, errors.New(errors.InvalidParameter, "static.NewHostSet", "no catalog id") + return nil, errors.NewDeprecated(errors.InvalidParameter, "static.NewHostSet", "no catalog id") } opts := getOpts(opt...) diff --git a/internal/host/static/host_set_member.go b/internal/host/static/host_set_member.go index 2a5af4c9f..672cf1abe 100644 --- a/internal/host/static/host_set_member.go +++ b/internal/host/static/host_set_member.go @@ -16,10 +16,10 @@ type HostSetMember struct { func NewHostSetMember(hostSetId, hostId string, opt ...Option) (*HostSetMember, error) { const op = "static.NewHostSetMember" if hostSetId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no host set id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "no host set id") } if hostId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no host id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "no host id") } member := &HostSetMember{ HostSetMember: &store.HostSetMember{ diff --git a/internal/host/static/public_ids.go b/internal/host/static/public_ids.go index 37af4ba18..2d291e178 100644 --- a/internal/host/static/public_ids.go +++ b/internal/host/static/public_ids.go @@ -25,7 +25,7 @@ const ( func newHostCatalogId() (string, error) { id, err := db.NewPublicId(HostCatalogPrefix) if err != nil { - return "", errors.Wrap(err, "static.newHostCatalogId") + return "", errors.WrapDeprecated(err, "static.newHostCatalogId") } return id, nil } @@ -33,7 +33,7 @@ func newHostCatalogId() (string, error) { func newHostId() (string, error) { id, err := db.NewPublicId(HostPrefix) if err != nil { - return "", errors.Wrap(err, "static.newHostId") + return "", errors.WrapDeprecated(err, "static.newHostId") } return id, nil } @@ -41,7 +41,7 @@ func newHostId() (string, error) { func newHostSetId() (string, error) { id, err := db.NewPublicId(HostSetPrefix) if err != nil { - return "", errors.Wrap(err, "static.newHostSetId") + return "", errors.WrapDeprecated(err, "static.newHostSetId") } return id, nil } diff --git a/internal/host/static/repository.go b/internal/host/static/repository.go index 4c598c49a..ed4bca656 100644 --- a/internal/host/static/repository.go +++ b/internal/host/static/repository.go @@ -25,11 +25,11 @@ func NewRepository(r db.Reader, w db.Writer, kms *kms.Kms, opt ...Option) (*Repo const op = "static.NewRepository" switch { case r == nil: - return nil, errors.New(errors.InvalidParameter, op, "db.Reader") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "db.Reader") case w == nil: - return nil, errors.New(errors.InvalidParameter, op, "db.Writer") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "db.Writer") case kms == nil: - return nil, errors.New(errors.InvalidParameter, op, "kms") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "kms") } opts := getOpts(opt...) diff --git a/internal/host/static/repository_host.go b/internal/host/static/repository_host.go index 1ad556611..3f395c883 100644 --- a/internal/host/static/repository_host.go +++ b/internal/host/static/repository_host.go @@ -24,23 +24,23 @@ import ( func (r *Repository) CreateHost(ctx context.Context, scopeId string, h *Host, opt ...Option) (*Host, error) { const op = "static.(Repository).CreateHost" if h == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil Host") + return nil, errors.New(ctx, errors.InvalidParameter, op, "nil Host") } if h.Host == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil embedded Host") + return nil, errors.New(ctx, errors.InvalidParameter, op, "nil embedded Host") } if h.CatalogId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no catalog id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no catalog id") } if h.PublicId != "" { - return nil, errors.New(errors.InvalidParameter, op, "public id not empty") + return nil, errors.New(ctx, errors.InvalidParameter, op, "public id not empty") } if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no scope id") } h.Address = strings.TrimSpace(h.Address) if len(h.Address) < MinHostAddressLength || len(h.Address) > MaxHostAddressLength { - return nil, errors.New(errors.InvalidAddress, op, "invalid address") + return nil, errors.New(ctx, errors.InvalidAddress, op, "invalid address") } h = h.clone() @@ -48,7 +48,7 @@ func (r *Repository) CreateHost(ctx context.Context, scopeId string, h *Host, op if opts.withPublicId != "" { if !strings.HasPrefix(opts.withPublicId, HostPrefix+"_") { - return nil, errors.New( + return nil, errors.New(ctx, errors.InvalidPublicId, op, fmt.Sprintf("passed-in public ID %q has wrong prefix, should be %q", opts.withPublicId, HostPrefix), @@ -58,14 +58,14 @@ func (r *Repository) CreateHost(ctx context.Context, scopeId string, h *Host, op } else { id, err := newHostId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } h.PublicId = id } oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var newHost *Host @@ -74,7 +74,7 @@ func (r *Repository) CreateHost(ctx context.Context, scopeId string, h *Host, op newHost = h.clone() err := w.Create(ctx, newHost, db.WithOplog(oplogWrapper, h.oplog(oplog.OpType_OP_TYPE_CREATE))) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, @@ -82,17 +82,17 @@ func (r *Repository) CreateHost(ctx context.Context, scopeId string, h *Host, op if err != nil { if errors.IsUniqueError(err) { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("in catalog: %s: name %s already exists", h.CatalogId, h.Name))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("in catalog: %s: name %s already exists", h.CatalogId, h.Name))) } if errors.IsCheckConstraintError(err) || errors.IsNotNullError(err) { - return nil, errors.New( + return nil, errors.New(ctx, errors.InvalidAddress, op, fmt.Sprintf("in catalog: %s: %q", h.CatalogId, h.Address), errors.WithWrap(err), ) } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("in catalog: %s", h.CatalogId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("in catalog: %s", h.CatalogId))) } return newHost, nil } @@ -112,19 +112,19 @@ func (r *Repository) CreateHost(ctx context.Context, scopeId string, h *Host, op func (r *Repository) UpdateHost(ctx context.Context, scopeId string, h *Host, version uint32, fieldMaskPaths []string, opt ...Option) (*Host, int, error) { const op = "static.(Repository).UpdateHost" if h == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "nil Host") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "nil Host") } if h.Host == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "nil embedded Host") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "nil embedded Host") } if h.PublicId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no public id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no public id") } if version == 0 { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no version") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no version") } if scopeId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no scope id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no scope id") } for _, f := range fieldMaskPaths { @@ -134,10 +134,10 @@ func (r *Repository) UpdateHost(ctx context.Context, scopeId string, h *Host, ve case strings.EqualFold("Address", f): h.Address = strings.TrimSpace(h.Address) if len(h.Address) < MinHostAddressLength || len(h.Address) > MaxHostAddressLength { - return nil, db.NoRowsAffected, errors.New(errors.InvalidAddress, op, "invalid address") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidAddress, op, "invalid address") } default: - return nil, db.NoRowsAffected, errors.New(errors.InvalidFieldMask, op, fmt.Sprintf("invalid field mask: %s", f)) + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidFieldMask, op, fmt.Sprintf("invalid field mask: %s", f)) } } var dbMask, nullFields []string @@ -151,12 +151,12 @@ func (r *Repository) UpdateHost(ctx context.Context, scopeId string, h *Host, ve nil, ) if len(dbMask) == 0 && len(nullFields) == 0 { - return nil, db.NoRowsAffected, errors.New(errors.EmptyFieldMask, op, "empty field mask") + return nil, db.NoRowsAffected, errors.New(ctx, errors.EmptyFieldMask, op, "empty field mask") } oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var rowsUpdated int @@ -169,10 +169,10 @@ func (r *Repository) UpdateHost(ctx context.Context, scopeId string, h *Host, ve db.WithOplog(oplogWrapper, h.oplog(oplog.OpType_OP_TYPE_UPDATE)), db.WithVersion(&version)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsUpdated > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been updated") } return nil }, @@ -180,17 +180,17 @@ func (r *Repository) UpdateHost(ctx context.Context, scopeId string, h *Host, ve if err != nil { if errors.IsUniqueError(err) { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("in %s: name %s already exists", h.PublicId, h.Name))) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("in %s: name %s already exists", h.PublicId, h.Name))) } if errors.IsCheckConstraintError(err) || errors.IsNotNullError(err) { - return nil, db.NoRowsAffected, errors.New( + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidAddress, op, fmt.Sprintf("in %s: %q", h.PublicId, h.Address), errors.WithWrap(err), ) } - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("in %s", h.PublicId))) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("in %s", h.PublicId))) } return returnedHost, rowsUpdated, nil @@ -201,7 +201,7 @@ func (r *Repository) UpdateHost(ctx context.Context, scopeId string, h *Host, ve func (r *Repository) LookupHost(ctx context.Context, publicId string, opt ...Option) (*Host, error) { const op = "static.(Repository).LookupHost" if publicId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no public id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no public id") } h := allocHost() h.PublicId = publicId @@ -209,7 +209,7 @@ func (r *Repository) LookupHost(ctx context.Context, publicId string, opt ...Opt if errors.IsNotFoundError(err) { return nil, nil } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", publicId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", publicId))) } return h, nil } @@ -219,7 +219,7 @@ func (r *Repository) LookupHost(ctx context.Context, publicId string, opt ...Opt func (r *Repository) ListHosts(ctx context.Context, catalogId string, opt ...Option) ([]*Host, error) { const op = "static.(Repository).ListHosts" if catalogId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no catalog id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no catalog id") } opts := getOpts(opt...) limit := r.defaultLimit @@ -230,7 +230,7 @@ func (r *Repository) ListHosts(ctx context.Context, catalogId string, opt ...Opt var hosts []*Host err := r.reader.SearchWhere(ctx, &hosts, "catalog_id = ?", []interface{}{catalogId}, db.WithLimit(limit)) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return hosts, nil } @@ -241,14 +241,14 @@ func (r *Repository) ListHosts(ctx context.Context, catalogId string, opt ...Opt func (r *Repository) DeleteHost(ctx context.Context, scopeId string, publicId string, opt ...Option) (int, error) { const op = "static.(Repository).DeleteHost" if publicId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no public id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no public id") } h := allocHost() h.PublicId = publicId oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var rowsDeleted int @@ -258,17 +258,17 @@ func (r *Repository) DeleteHost(ctx context.Context, scopeId string, publicId st dh := h.clone() rowsDeleted, err = w.Delete(ctx, dh, db.WithOplog(oplogWrapper, h.oplog(oplog.OpType_OP_TYPE_DELETE))) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("delete failed for %s", publicId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("delete failed for %s", publicId))) } return rowsDeleted, nil diff --git a/internal/host/static/repository_host_catalog.go b/internal/host/static/repository_host_catalog.go index 1be6d3dad..6ff019e96 100644 --- a/internal/host/static/repository_host_catalog.go +++ b/internal/host/static/repository_host_catalog.go @@ -23,16 +23,16 @@ import ( func (r *Repository) CreateCatalog(ctx context.Context, c *HostCatalog, opt ...Option) (*HostCatalog, error) { const op = "static.(Repository).CreateCatalog" if c == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil HostCatalog") + return nil, errors.New(ctx, errors.InvalidParameter, op, "nil HostCatalog") } if c.HostCatalog == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil embedded HostCatalog") + return nil, errors.New(ctx, errors.InvalidParameter, op, "nil embedded HostCatalog") } if c.ScopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no scope id") } if c.PublicId != "" { - return nil, errors.New(errors.InvalidParameter, op, "public id not empty") + return nil, errors.New(ctx, errors.InvalidParameter, op, "public id not empty") } c = c.clone() @@ -40,7 +40,7 @@ func (r *Repository) CreateCatalog(ctx context.Context, c *HostCatalog, opt ...O if opts.withPublicId != "" { if !strings.HasPrefix(opts.withPublicId, HostCatalogPrefix+"_") { - return nil, errors.New( + return nil, errors.New(ctx, errors.InvalidPublicId, op, fmt.Sprintf("passed-in public ID %q has wrong prefix, should be %q", opts.withPublicId, HostCatalogPrefix), @@ -50,14 +50,14 @@ func (r *Repository) CreateCatalog(ctx context.Context, c *HostCatalog, opt ...O } else { id, err := newHostCatalogId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } c.PublicId = id } oplogWrapper, err := r.kms.GetWrapper(ctx, c.ScopeId, kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } metadata := newCatalogMetadata(c, oplog.OpType_OP_TYPE_CREATE) @@ -75,7 +75,7 @@ func (r *Repository) CreateCatalog(ctx context.Context, c *HostCatalog, opt ...O db.WithOplog(oplogWrapper, metadata), ) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, @@ -83,9 +83,9 @@ func (r *Repository) CreateCatalog(ctx context.Context, c *HostCatalog, opt ...O if err != nil { if errors.IsUniqueError(err) { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("in scope: %s: name %s already exists", c.ScopeId, c.Name))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("in scope: %s: name %s already exists", c.ScopeId, c.Name))) } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("in scope: %s", c.ScopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("in scope: %s", c.ScopeId))) } return newHostCatalog, nil } @@ -104,19 +104,19 @@ func (r *Repository) CreateCatalog(ctx context.Context, c *HostCatalog, opt ...O func (r *Repository) UpdateCatalog(ctx context.Context, c *HostCatalog, version uint32, fieldMask []string, opt ...Option) (*HostCatalog, int, error) { const op = "static.(Repository).UpdateCatalog" if c == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "nil HostCatalog") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "nil HostCatalog") } if c.HostCatalog == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "nil embedded HostCatalog") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "nil embedded HostCatalog") } if c.PublicId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no public id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no public id") } if c.ScopeId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no scope id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no scope id") } if len(fieldMask) == 0 { - return nil, db.NoRowsAffected, errors.New(errors.EmptyFieldMask, op, "empty field mask") + return nil, db.NoRowsAffected, errors.New(ctx, errors.EmptyFieldMask, op, "empty field mask") } var dbMask, nullFields []string @@ -132,13 +132,13 @@ func (r *Repository) UpdateCatalog(ctx context.Context, c *HostCatalog, version dbMask = append(dbMask, "description") default: - return nil, db.NoRowsAffected, errors.New(errors.InvalidFieldMask, op, fmt.Sprintf("invalid field mask: %s", f)) + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidFieldMask, op, fmt.Sprintf("invalid field mask: %s", f)) } } oplogWrapper, err := r.kms.GetWrapper(ctx, c.ScopeId, kms.KeyPurposeOplog) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } c = c.clone() @@ -163,10 +163,10 @@ func (r *Repository) UpdateCatalog(ctx context.Context, c *HostCatalog, version db.WithVersion(&version), ) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsUpdated > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been updated") } return nil }, @@ -174,9 +174,9 @@ func (r *Repository) UpdateCatalog(ctx context.Context, c *HostCatalog, version if err != nil { if errors.IsUniqueError(err) { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("in %s: name %s already exists", c.PublicId, c.Name))) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("in %s: name %s already exists", c.PublicId, c.Name))) } - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("in %s", c.PublicId))) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("in %s", c.PublicId))) } return returnedCatalog, rowsUpdated, nil @@ -187,7 +187,7 @@ func (r *Repository) UpdateCatalog(ctx context.Context, c *HostCatalog, version func (r *Repository) LookupCatalog(ctx context.Context, id string, opt ...Option) (*HostCatalog, error) { const op = "static.(Repository).LookupCatalog" if id == "" { - return nil, errors.New(errors.InvalidParameter, op, "no public id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no public id") } c := allocCatalog() c.PublicId = id @@ -195,7 +195,7 @@ func (r *Repository) LookupCatalog(ctx context.Context, id string, opt ...Option if errors.IsNotFoundError(err) { return nil, nil } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for: %s", id))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for: %s", id))) } return c, nil } @@ -204,7 +204,7 @@ func (r *Repository) LookupCatalog(ctx context.Context, id string, opt ...Option func (r *Repository) ListCatalogs(ctx context.Context, scopeIds []string, opt ...Option) ([]*HostCatalog, error) { const op = "static.(Repository).ListCatalogs" if len(scopeIds) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "no scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no scope id") } opts := getOpts(opt...) limit := r.defaultLimit @@ -215,7 +215,7 @@ func (r *Repository) ListCatalogs(ctx context.Context, scopeIds []string, opt .. var hostCatalogs []*HostCatalog err := r.reader.SearchWhere(ctx, &hostCatalogs, "scope_id in (?)", []interface{}{scopeIds}, db.WithLimit(limit)) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return hostCatalogs, nil } @@ -225,7 +225,7 @@ func (r *Repository) ListCatalogs(ctx context.Context, scopeIds []string, opt .. func (r *Repository) DeleteCatalog(ctx context.Context, id string, opt ...Option) (int, error) { const op = "static.(Repository).DeleteCatalog" if id == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no public id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no public id") } c := allocCatalog() @@ -234,14 +234,14 @@ func (r *Repository) DeleteCatalog(ctx context.Context, id string, opt ...Option if errors.IsNotFoundError(err) { return db.NoRowsAffected, nil } - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", id))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", id))) } if c.ScopeId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no scope id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no scope id") } oplogWrapper, err := r.kms.GetWrapper(ctx, c.ScopeId, kms.KeyPurposeOplog) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } metadata := newCatalogMetadata(c, oplog.OpType_OP_TYPE_DELETE) @@ -261,17 +261,17 @@ func (r *Repository) DeleteCatalog(ctx context.Context, id string, opt ...Option db.WithOplog(oplogWrapper, metadata), ) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("delete failed for %s", c.PublicId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("delete failed for %s", c.PublicId))) } return rowsDeleted, nil diff --git a/internal/host/static/repository_host_set.go b/internal/host/static/repository_host_set.go index 21426362e..a3d986924 100644 --- a/internal/host/static/repository_host_set.go +++ b/internal/host/static/repository_host_set.go @@ -22,19 +22,19 @@ import ( func (r *Repository) CreateSet(ctx context.Context, scopeId string, s *HostSet, opt ...Option) (*HostSet, error) { const op = "static.(Repository).CreateSet" if s == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil HostSet") + return nil, errors.New(ctx, errors.InvalidParameter, op, "nil HostSet") } if s.HostSet == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil embedded HostSet") + return nil, errors.New(ctx, errors.InvalidParameter, op, "nil embedded HostSet") } if s.CatalogId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no catalog id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no catalog id") } if s.PublicId != "" { - return nil, errors.New(errors.InvalidParameter, op, "public id not empty") + return nil, errors.New(ctx, errors.InvalidParameter, op, "public id not empty") } if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no scope id") } s = s.clone() @@ -42,7 +42,7 @@ func (r *Repository) CreateSet(ctx context.Context, scopeId string, s *HostSet, if opts.withPublicId != "" { if !strings.HasPrefix(opts.withPublicId, HostSetPrefix+"_") { - return nil, errors.New( + return nil, errors.New(ctx, errors.InvalidPublicId, op, fmt.Sprintf("passed-in public ID %q has wrong prefix, should be %q", opts.withPublicId, HostSetPrefix), @@ -52,14 +52,14 @@ func (r *Repository) CreateSet(ctx context.Context, scopeId string, s *HostSet, } else { id, err := newHostSetId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } s.PublicId = id } oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var newHostSet *HostSet @@ -68,7 +68,7 @@ func (r *Repository) CreateSet(ctx context.Context, scopeId string, s *HostSet, newHostSet = s.clone() err := w.Create(ctx, newHostSet, db.WithOplog(oplogWrapper, s.oplog(oplog.OpType_OP_TYPE_CREATE))) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, @@ -76,9 +76,9 @@ func (r *Repository) CreateSet(ctx context.Context, scopeId string, s *HostSet, if err != nil { if errors.IsUniqueError(err) { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("in catalog: %s: name %s already exists", s.CatalogId, s.Name))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("in catalog: %s: name %s already exists", s.CatalogId, s.Name))) } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("in catalog: %s", s.CatalogId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("in catalog: %s", s.CatalogId))) } return newHostSet, nil } @@ -100,19 +100,19 @@ func (r *Repository) CreateSet(ctx context.Context, scopeId string, s *HostSet, func (r *Repository) UpdateSet(ctx context.Context, scopeId string, s *HostSet, version uint32, fieldMaskPaths []string, opt ...Option) (*HostSet, []*Host, int, error) { const op = "static.(Repository).UpdateSet" if s == nil { - return nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "nil HostSet") + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "nil HostSet") } if s.HostSet == nil { - return nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "nil embedded HostSet") + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "nil embedded HostSet") } if s.PublicId == "" { - return nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no public id") + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no public id") } if version == 0 { - return nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no version") + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no version") } if scopeId == "" { - return nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no scope id") + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no scope id") } for _, f := range fieldMaskPaths { @@ -120,7 +120,7 @@ func (r *Repository) UpdateSet(ctx context.Context, scopeId string, s *HostSet, case strings.EqualFold("Name", f): case strings.EqualFold("Description", f): default: - return nil, nil, db.NoRowsAffected, errors.New(errors.InvalidFieldMask, op, fmt.Sprintf("invalid field mask: %s", f)) + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidFieldMask, op, fmt.Sprintf("invalid field mask: %s", f)) } } var dbMask, nullFields []string @@ -133,7 +133,7 @@ func (r *Repository) UpdateSet(ctx context.Context, scopeId string, s *HostSet, nil, ) if len(dbMask) == 0 && len(nullFields) == 0 { - return nil, nil, db.NoRowsAffected, errors.New(errors.EmptyFieldMask, op, "empty field mask") + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.EmptyFieldMask, op, "empty field mask") } opts := getOpts(opt...) @@ -145,7 +145,7 @@ func (r *Repository) UpdateSet(ctx context.Context, scopeId string, s *HostSet, oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var rowsUpdated int @@ -159,14 +159,14 @@ func (r *Repository) UpdateSet(ctx context.Context, scopeId string, s *HostSet, db.WithOplog(oplogWrapper, s.oplog(oplog.OpType_OP_TYPE_UPDATE)), db.WithVersion(&version)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsUpdated > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been updated") } hosts, err = getHosts(ctx, reader, s.PublicId, limit) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, @@ -174,9 +174,9 @@ func (r *Repository) UpdateSet(ctx context.Context, scopeId string, s *HostSet, if err != nil { if errors.IsUniqueError(err) { - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("in %s: name %s already exists", s.PublicId, s.Name))) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("in %s: name %s already exists", s.PublicId, s.Name))) } - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("in %s", s.PublicId))) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("in %s", s.PublicId))) } return returnedHostSet, hosts, rowsUpdated, nil @@ -189,7 +189,7 @@ func (r *Repository) UpdateSet(ctx context.Context, scopeId string, s *HostSet, func (r *Repository) LookupSet(ctx context.Context, publicId string, opt ...Option) (*HostSet, []*Host, error) { const op = "static.(Repository).LookupSet" if publicId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "no public id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "no public id") } opts := getOpts(opt...) limit := r.defaultLimit @@ -209,19 +209,19 @@ func (r *Repository) LookupSet(ctx context.Context, publicId string, opt ...Opti return nil } if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } var err error hosts, err = getHosts(ctx, reader, s.PublicId, limit) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("in %s", s.PublicId))) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("in %s", s.PublicId))) } return s, hosts, nil @@ -232,7 +232,7 @@ func (r *Repository) LookupSet(ctx context.Context, publicId string, opt ...Opti func (r *Repository) ListSets(ctx context.Context, catalogId string, opt ...Option) ([]*HostSet, error) { const op = "static.(Repository).ListSets" if catalogId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no catalog id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no catalog id") } opts := getOpts(opt...) limit := r.defaultLimit @@ -243,7 +243,7 @@ func (r *Repository) ListSets(ctx context.Context, catalogId string, opt ...Opti var sets []*HostSet err := r.reader.SearchWhere(ctx, &sets, "catalog_id = ?", []interface{}{catalogId}, db.WithLimit(limit)) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return sets, nil } @@ -254,17 +254,17 @@ func (r *Repository) ListSets(ctx context.Context, catalogId string, opt ...Opti func (r *Repository) DeleteSet(ctx context.Context, scopeId string, publicId string, opt ...Option) (int, error) { const op = "static.(Repository).DeleteSet" if publicId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no public id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no public id") } if scopeId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no scope id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no scope id") } s := allocHostSet() s.PublicId = publicId oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var rowsDeleted int @@ -274,17 +274,17 @@ func (r *Repository) DeleteSet(ctx context.Context, scopeId string, publicId str ds := s.clone() rowsDeleted, err = w.Delete(ctx, ds, db.WithOplog(oplogWrapper, s.oplog(oplog.OpType_OP_TYPE_DELETE))) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("delete failed for %s", s.PublicId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("delete failed for %s", s.PublicId))) } return rowsDeleted, nil diff --git a/internal/host/static/repository_host_set_member.go b/internal/host/static/repository_host_set_member.go index 75da2d13f..a7dae0527 100644 --- a/internal/host/static/repository_host_set_member.go +++ b/internal/host/static/repository_host_set_member.go @@ -20,27 +20,27 @@ import ( func (r *Repository) AddSetMembers(ctx context.Context, scopeId string, setId string, version uint32, hostIds []string, opt ...Option) ([]*Host, error) { const op = "static.(Repository).AddSetMembers" if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no scope id") } if setId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no set id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no set id") } if version == 0 { - return nil, errors.New(errors.InvalidParameter, op, "no version") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no version") } if len(hostIds) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "no host ids") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no host ids") } // Create in-memory host set members - members, err := r.newMembers(setId, hostIds) + members, err := r.newMembers(ctx, setId, hostIds) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } wrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var hosts []*Host @@ -51,33 +51,33 @@ func (r *Repository) AddSetMembers(ctx context.Context, scopeId string, setId st // Create host set members msgs, err := createMembers(ctx, w, members) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } // Update host set version if err := updateVersion(ctx, w, wrapper, metadata, msgs, set, version); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } hosts, err = getHosts(ctx, reader, setId, unlimited) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return hosts, nil } -func (r *Repository) newMembers(setId string, hostIds []string) ([]interface{}, error) { +func (r *Repository) newMembers(ctx context.Context, setId string, hostIds []string) ([]interface{}, error) { var members []interface{} for _, id := range hostIds { var m *HostSetMember m, err := NewHostSetMember(setId, id) if err != nil { - return nil, errors.Wrap(err, "static.newMembers") + return nil, errors.Wrap(ctx, err, "static.newMembers") } members = append(members, m) } @@ -87,7 +87,7 @@ func (r *Repository) newMembers(setId string, hostIds []string) ([]interface{}, func createMembers(ctx context.Context, w db.Writer, members []interface{}) ([]*oplog.Message, error) { var msgs []*oplog.Message if err := w.CreateItems(ctx, members, db.NewOplogMsgs(&msgs)); err != nil { - return nil, errors.Wrap(err, "static.createMembers") + return nil, errors.Wrap(ctx, err, "static.createMembers") } return msgs, nil } @@ -98,19 +98,19 @@ func updateVersion(ctx context.Context, w db.Writer, wrapper wrapping.Wrapper, m rowsUpdated, err := w.Update(ctx, set, []string{"Version"}, nil, db.NewOplogMsg(setMsg), db.WithVersion(&version)) switch { case err != nil: - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) case rowsUpdated > 1: - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been updated") } msgs = append(msgs, setMsg) // Write oplog ticket, err := w.GetTicket(set) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } if err := w.WriteOplogEntryWith(ctx, wrapper, ticket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } return nil } @@ -147,7 +147,7 @@ func getHosts(ctx context.Context, reader db.Reader, setId string, limit int) ([ params, db.WithLimit(limit), ); err != nil { - return nil, errors.Wrap(err, "static.getHosts") + return nil, errors.Wrap(ctx, err, "static.getHosts") } if len(hosts) == 0 { return nil, nil @@ -161,27 +161,27 @@ func getHosts(ctx context.Context, reader db.Reader, setId string, limit int) ([ func (r *Repository) DeleteSetMembers(ctx context.Context, scopeId string, setId string, version uint32, hostIds []string, opt ...Option) (int, error) { const op = "static.(Repository).DeleteSetMembers" if scopeId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no scope id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no scope id") } if setId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no set id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no set id") } if version == 0 { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no version") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no version") } if len(hostIds) == 0 { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no host ids") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no host ids") } // Create in-memory host set members - members, err := r.newMembers(setId, hostIds) + members, err := r.newMembers(ctx, setId, hostIds) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op) + return db.NoRowsAffected, errors.Wrap(ctx, err, op) } wrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } _, err = r.writer.DoTx(ctx, db.StdRetryCnt, db.ExpBackoff{}, func(_ db.Reader, w db.Writer) error { @@ -191,19 +191,19 @@ func (r *Repository) DeleteSetMembers(ctx context.Context, scopeId string, setId // Delete host set members msgs, err := deleteMembers(ctx, w, members) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } // Update host set version err = updateVersion(ctx, w, wrapper, metadata, msgs, set, version) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op) + return db.NoRowsAffected, errors.Wrap(ctx, err, op) } return len(hostIds), nil } @@ -213,10 +213,10 @@ func deleteMembers(ctx context.Context, w db.Writer, members []interface{}) ([]* var msgs []*oplog.Message rowsDeleted, err := w.DeleteItems(ctx, members, db.NewOplogMsgs(&msgs)) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if rowsDeleted != len(members) { - return nil, errors.E(errors.WithMsg(fmt.Sprintf("set members deleted %d did not match request for %d", rowsDeleted, len(members)))) + return nil, errors.E(ctx, errors.WithMsg(fmt.Sprintf("set members deleted %d did not match request for %d", rowsDeleted, len(members)))) } return msgs, nil } @@ -229,13 +229,13 @@ func deleteMembers(ctx context.Context, w db.Writer, members []interface{}) ([]* func (r *Repository) SetSetMembers(ctx context.Context, scopeId string, setId string, version uint32, hostIds []string, opt ...Option) ([]*Host, int, error) { const op = "static.(Repository).SetSetMembers" if scopeId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no scope id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no scope id") } if setId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no set id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no set id") } if version == 0 { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "no version") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "no version") } // TODO(mgaffney) 08/2020: Oplog does not currently support bulk @@ -253,13 +253,13 @@ func (r *Repository) SetSetMembers(ctx context.Context, scopeId string, setId st // this pattern. changes, err := r.changes(ctx, setId, hostIds) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } var deletions, additions []interface{} for _, c := range changes { m, err := NewHostSetMember(setId, c.HostId) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } switch c.Action { case "delete": @@ -273,7 +273,7 @@ func (r *Repository) SetSetMembers(ctx context.Context, scopeId string, setId st if len(changes) > 0 { wrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } _, err = r.writer.DoTx(ctx, db.StdRetryCnt, db.ExpBackoff{}, func(reader db.Reader, w db.Writer) error { @@ -285,7 +285,7 @@ func (r *Repository) SetSetMembers(ctx context.Context, scopeId string, setId st if len(deletions) > 0 { deletedMsgs, err := deleteMembers(ctx, w, deletions) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } msgs = append(msgs, deletedMsgs...) metadata["op-type"] = append(metadata["op-type"], oplog.OpType_OP_TYPE_DELETE.String()) @@ -295,7 +295,7 @@ func (r *Repository) SetSetMembers(ctx context.Context, scopeId string, setId st if len(additions) > 0 { createdMsgs, err := createMembers(ctx, w, additions) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } msgs = append(msgs, createdMsgs...) metadata["op-type"] = append(metadata["op-type"], oplog.OpType_OP_TYPE_CREATE.String()) @@ -303,18 +303,18 @@ func (r *Repository) SetSetMembers(ctx context.Context, scopeId string, setId st // Update host set version if err := updateVersion(ctx, w, wrapper, metadata, msgs, set, version); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } hosts, err = getHosts(ctx, reader, setId, unlimited) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } } return hosts, len(changes), nil @@ -345,7 +345,7 @@ func (r *Repository) changes(ctx context.Context, setId string, hostIds []string } rows, err := r.reader.Query(ctx, query, params) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("query failed")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("query failed")) } defer rows.Close() @@ -353,7 +353,7 @@ func (r *Repository) changes(ctx context.Context, setId string, hostIds []string for rows.Next() { var chg change if err := r.reader.ScanRows(rows, &chg); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("scan row failed")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("scan row failed")) } changes = append(changes, &chg) } diff --git a/internal/iam/account.go b/internal/iam/account.go index 742a2138d..8a902e07b 100644 --- a/internal/iam/account.go +++ b/internal/iam/account.go @@ -46,10 +46,10 @@ func (a *authAccount) Clone() interface{} { func (a *authAccount) VetForWrite(ctx context.Context, r db.Reader, opType db.OpType, opt ...db.Option) error { const op = "iam.(authAccount).VetForWrite" if a.PublicId == "" { - return errors.New(errors.InvalidParameter, op, "missing public id") + return errors.New(ctx, errors.InvalidParameter, op, "missing public id") } if err := validateScopeForWrite(ctx, r, a, opType, opt...); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } diff --git a/internal/iam/group.go b/internal/iam/group.go index b445582c6..ae514e232 100644 --- a/internal/iam/group.go +++ b/internal/iam/group.go @@ -34,7 +34,7 @@ var ( func NewGroup(scopeId string, opt ...Option) (*Group, error) { const op = "iam.NewGroup" if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing scope id") } opts := getOpts(opt...) g := &Group{ @@ -66,10 +66,10 @@ func allocGroup() Group { func (g *Group) VetForWrite(ctx context.Context, r db.Reader, opType db.OpType, opt ...db.Option) error { const op = "iam.(Group).VetForWrite" if g.PublicId == "" { - return errors.New(errors.InvalidParameter, op, "missing public id") + return errors.New(ctx, errors.InvalidParameter, op, "missing public id") } if err := validateScopeForWrite(ctx, r, g, opType, opt...); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } diff --git a/internal/iam/group_member.go b/internal/iam/group_member.go index 6c88ef114..2f871970e 100644 --- a/internal/iam/group_member.go +++ b/internal/iam/group_member.go @@ -73,10 +73,10 @@ var ( func NewGroupMemberUser(groupId, userId string, _ ...Option) (*GroupMemberUser, error) { const op = "iam.NewGroupMemberUser" if groupId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing group id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing group id") } if userId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing user id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing user id") } return &GroupMemberUser{ GroupMemberUser: &store.GroupMemberUser{ @@ -104,10 +104,10 @@ func (m *GroupMemberUser) Clone() interface{} { func (m *GroupMemberUser) VetForWrite(ctx context.Context, r db.Reader, opType db.OpType, opt ...db.Option) error { const op = "iam.(GroupMemberUser).VetForWrite" if m.GroupId == "" { - return errors.New(errors.InvalidParameter, op, "missing group id") + return errors.New(ctx, errors.InvalidParameter, op, "missing group id") } if m.MemberId == "" { - return errors.New(errors.InvalidParameter, op, "missing member id") + return errors.New(ctx, errors.InvalidParameter, op, "missing member id") } return nil } diff --git a/internal/iam/ids.go b/internal/iam/ids.go index 18cbe9b02..db76758b3 100644 --- a/internal/iam/ids.go +++ b/internal/iam/ids.go @@ -18,7 +18,7 @@ const ( func newRoleId() (string, error) { id, err := db.NewPublicId(RolePrefix) if err != nil { - return "", errors.Wrap(err, "iam.newRoleId") + return "", errors.WrapDeprecated(err, "iam.newRoleId") } return id, nil } @@ -26,7 +26,7 @@ func newRoleId() (string, error) { func newUserId() (string, error) { id, err := db.NewPublicId(UserPrefix) if err != nil { - return "", errors.Wrap(err, "iam.newUserId") + return "", errors.WrapDeprecated(err, "iam.newUserId") } return id, nil } @@ -34,7 +34,7 @@ func newUserId() (string, error) { func newGroupId() (string, error) { id, err := db.NewPublicId(GroupPrefix) if err != nil { - return "", errors.Wrap(err, "iam.newGroupId") + return "", errors.WrapDeprecated(err, "iam.newGroupId") } return id, nil } @@ -42,11 +42,11 @@ func newGroupId() (string, error) { func newScopeId(scopeType scope.Type) (string, error) { const op = "iam.newScopeId" if scopeType == scope.Unknown { - return "", errors.New(errors.InvalidParameter, op, "unknown scope is not supported") + return "", errors.NewDeprecated(errors.InvalidParameter, op, "unknown scope is not supported") } id, err := db.NewPublicId(scopeType.Prefix()) if err != nil { - return "", errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("scope type: %s", scopeType.String()))) + return "", errors.WrapDeprecated(err, op, errors.WithMsg(fmt.Sprintf("scope type: %s", scopeType.String()))) } return id, nil } diff --git a/internal/iam/principal_role.go b/internal/iam/principal_role.go index 363bb713e..f5a4a7016 100644 --- a/internal/iam/principal_role.go +++ b/internal/iam/principal_role.go @@ -80,10 +80,10 @@ var ( func NewUserRole(roleId, userId string, _ ...Option) (*UserRole, error) { const op = "iam.NewUserRole" if roleId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing role id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing role id") } if userId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing user id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing user id") } return &UserRole{ UserRole: &store.UserRole{ @@ -108,13 +108,13 @@ func (r *UserRole) Clone() interface{} { } // VetForWrite implements db.VetForWrite() interface for user roles. -func (role *UserRole) VetForWrite(_ context.Context, _ db.Reader, _ db.OpType, _ ...db.Option) error { +func (role *UserRole) VetForWrite(ctx context.Context, _ db.Reader, _ db.OpType, _ ...db.Option) error { const op = "iam.(UserRole).VetForWrite" if role.RoleId == "" { - return errors.New(errors.InvalidParameter, op, "missing role id") + return errors.New(ctx, errors.InvalidParameter, op, "missing role id") } if role.PrincipalId == "" { - return errors.New(errors.InvalidParameter, op, "missing user id") + return errors.New(ctx, errors.InvalidParameter, op, "missing user id") } return nil } @@ -157,10 +157,10 @@ var ( func NewGroupRole(roleId, groupId string, opt ...Option) (*GroupRole, error) { const op = "iam.NewGroupRole" if roleId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing role id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing role id") } if groupId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing group id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing group id") } return &GroupRole{ GroupRole: &store.GroupRole{ @@ -188,10 +188,10 @@ func (r *GroupRole) Clone() interface{} { func (role *GroupRole) VetForWrite(ctx context.Context, r db.Reader, opType db.OpType, opt ...db.Option) error { const op = "iam.(GroupRole).VetForWrite" if role.RoleId == "" { - return errors.New(errors.InvalidParameter, op, "missing role id") + return errors.New(ctx, errors.InvalidParameter, op, "missing role id") } if role.PrincipalId == "" { - return errors.New(errors.InvalidParameter, op, "missing group id") + return errors.New(ctx, errors.InvalidParameter, op, "missing group id") } return nil } @@ -234,10 +234,10 @@ var ( func NewManagedGroupRole(roleId, managedGroupId string, opt ...Option) (*ManagedGroupRole, error) { const op = "iam.NewManagedGroupRole" if roleId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing role id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing role id") } if managedGroupId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing managed group id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing managed group id") } return &ManagedGroupRole{ ManagedGroupRole: &store.ManagedGroupRole{ @@ -267,10 +267,10 @@ func (r *ManagedGroupRole) Clone() interface{} { func (role ManagedGroupRole) VetForWrite(ctx context.Context, r db.Reader, opType db.OpType, opt ...db.Option) error { const op = "iam.(ManagedGroupRole).VetForWrite" if role.RoleId == "" { - return errors.New(errors.InvalidParameter, op, "missing role id") + return errors.New(ctx, errors.InvalidParameter, op, "missing role id") } if role.PrincipalId == "" { - return errors.New(errors.InvalidParameter, op, "missing managed group id") + return errors.New(ctx, errors.InvalidParameter, op, "missing managed group id") } return nil } diff --git a/internal/iam/repository.go b/internal/iam/repository.go index 93dcd4ff3..17cf4db87 100644 --- a/internal/iam/repository.go +++ b/internal/iam/repository.go @@ -12,7 +12,7 @@ import ( "github.com/hashicorp/boundary/internal/types/scope" ) -var ErrMetadataScopeNotFound = errors.New(errors.RecordNotFound, "iam", "scope not found for metadata") +var ErrMetadataScopeNotFound = errors.NewDeprecated(errors.RecordNotFound, "iam", "scope not found for metadata", errors.WithoutEvent()) // Repository is the iam database repository type Repository struct { @@ -29,13 +29,13 @@ type Repository struct { func NewRepository(r db.Reader, w db.Writer, kms *kms.Kms, opt ...Option) (*Repository, error) { const op = "iam.NewRepository" if r == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil reader") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil reader") } if w == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil writer") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil writer") } if kms == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil kms") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil kms") } opts := getOpts(opt...) if opts.withLimit == 0 { @@ -66,25 +66,25 @@ func (r *Repository) list(ctx context.Context, resources interface{}, where stri func (r *Repository) create(ctx context.Context, resource Resource, _ ...Option) (Resource, error) { const op = "iam.(Repository).create" if resource == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing resource") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing resource") } resourceCloner, ok := resource.(Cloneable) if !ok { - return nil, errors.New(errors.InvalidParameter, op, "resource is not Cloneable") + return nil, errors.New(ctx, errors.InvalidParameter, op, "resource is not Cloneable") } metadata, err := r.stdMetadata(ctx, resource) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("error getting metadata")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("error getting metadata")) } metadata["op-type"] = []string{oplog.OpType_OP_TYPE_CREATE.String()} scope, err := resource.GetScope(ctx, r.reader) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get scope")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get scope")) } oplogWrapper, err := r.kms.GetWrapper(ctx, scope.GetPublicId(), kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var returnedResource interface{} @@ -100,13 +100,13 @@ func (r *Repository) create(ctx context.Context, resource Resource, _ ...Option) db.WithOplog(oplogWrapper, metadata), ) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return returnedResource.(Resource), nil } @@ -115,18 +115,18 @@ func (r *Repository) create(ctx context.Context, resource Resource, _ ...Option) func (r *Repository) update(ctx context.Context, resource Resource, version uint32, fieldMaskPaths []string, setToNullPaths []string, opt ...Option) (Resource, int, error) { const op = "iam.(Repository).update" if version == 0 { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing version") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing version") } if resource == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing resource") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing resource") } resourceCloner, ok := resource.(Cloneable) if !ok { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "resource is not Cloneable") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "resource is not Cloneable") } metadata, err := r.stdMetadata(ctx, resource) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("error getting metadata")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("error getting metadata")) } metadata["op-type"] = []string{oplog.OpType_OP_TYPE_UPDATE.String()} @@ -145,12 +145,12 @@ func (r *Repository) update(ctx context.Context, resource Resource, version uint default: scope, err = resource.GetScope(ctx, r.reader) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get scope")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get scope")) } } oplogWrapper, err := r.kms.GetWrapper(ctx, scope.GetPublicId(), kms.KeyPurposeOplog) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } dbOpts = append(dbOpts, db.WithOplog(oplogWrapper, metadata)) @@ -170,17 +170,17 @@ func (r *Repository) update(ctx context.Context, resource Resource, version uint dbOpts..., ) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsUpdated > 1 { // return err, which will result in a rollback of the update - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been updated") } return nil }, ) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } return returnedResource.(Resource), rowsUpdated, nil } @@ -189,25 +189,25 @@ func (r *Repository) update(ctx context.Context, resource Resource, version uint func (r *Repository) delete(ctx context.Context, resource Resource, _ ...Option) (int, error) { const op = "iam.(Repository).delete" if resource == nil { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing resource") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing resource") } resourceCloner, ok := resource.(Cloneable) if !ok { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "resource is not Cloneable") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "resource is not Cloneable") } metadata, err := r.stdMetadata(ctx, resource) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("error getting metadata")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("error getting metadata")) } metadata["op-type"] = []string{oplog.OpType_OP_TYPE_DELETE.String()} scope, err := resource.GetScope(ctx, r.reader) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get scope")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get scope")) } oplogWrapper, err := r.kms.GetWrapper(ctx, scope.GetPublicId(), kms.KeyPurposeOplog) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var rowsDeleted int @@ -224,17 +224,17 @@ func (r *Repository) delete(ctx context.Context, resource Resource, _ ...Option) db.WithOplog(oplogWrapper, metadata), ) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { // return err, which will result in a rollback of the delete - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op) + return db.NoRowsAffected, errors.Wrap(ctx, err, op) } return rowsDeleted, nil } @@ -247,7 +247,7 @@ func (r *Repository) stdMetadata(ctx context.Context, resource Resource) (oplog. newScope.Type = s.Type if newScope.Type == "" { if err := r.reader.LookupByPublicId(ctx, &newScope); err != nil { - return nil, errors.Wrap(ErrMetadataScopeNotFound, op) + return nil, errors.Wrap(ctx, ErrMetadataScopeNotFound, op) } } switch newScope.Type { @@ -266,16 +266,16 @@ func (r *Repository) stdMetadata(ctx context.Context, resource Resource) (oplog. "resource-type": []string{resource.ResourceType().String()}, }, nil default: - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("not a supported scope for metadata: %s", s.Type)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("not a supported scope for metadata: %s", s.Type)) } } scope, err := resource.GetScope(ctx, r.reader) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get scope")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get scope")) } if scope == nil { - return nil, errors.E(errors.WithOp(op), errors.WithMsg("nil scope")) + return nil, errors.E(ctx, errors.WithOp(op), errors.WithMsg("nil scope")) } return oplog.Metadata{ "resource-public-id": []string{resource.GetPublicId()}, diff --git a/internal/iam/repository_group.go b/internal/iam/repository_group.go index c2a82f8cd..e14b7e3d7 100644 --- a/internal/iam/repository_group.go +++ b/internal/iam/repository_group.go @@ -17,29 +17,29 @@ import ( func (r *Repository) CreateGroup(ctx context.Context, group *Group, _ ...Option) (*Group, error) { const op = "iam.(Repository).CreateGroup" if group == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing group") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing group") } if group.Group == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing group store") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing group store") } if group.PublicId != "" { - return nil, errors.New(errors.InvalidParameter, op, "public id not empty") + return nil, errors.New(ctx, errors.InvalidParameter, op, "public id not empty") } if group.ScopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } id, err := newGroupId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } g := group.Clone().(*Group) g.PublicId = id resource, err := r.create(ctx, g) if err != nil { if errors.IsUniqueError(err) { - return nil, errors.New(errors.NotUnique, op, fmt.Sprintf("group %s already exists in scope %s", group.Name, group.ScopeId)) + return nil, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("group %s already exists in scope %s", group.Name, group.ScopeId)) } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("for group %s", g.PublicId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("for group %s", g.PublicId))) } return resource.(*Group), nil } @@ -52,20 +52,20 @@ func (r *Repository) CreateGroup(ctx context.Context, group *Group, _ ...Option) func (r *Repository) UpdateGroup(ctx context.Context, group *Group, version uint32, fieldMaskPaths []string, _ ...Option) (*Group, []*GroupMember, int, error) { const op = "iam.(Repository).UpdateGroup" if group == nil { - return nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing group") + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing group") } if group.Group == nil { - return nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing group store") + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing group store") } if group.PublicId == "" { - return nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing public id") + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } for _, f := range fieldMaskPaths { switch { case strings.EqualFold("name", f): case strings.EqualFold("description", f): default: - return nil, nil, db.NoRowsAffected, errors.New(errors.InvalidFieldMask, op, fmt.Sprintf("invalid field mask: %s", f)) + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidFieldMask, op, fmt.Sprintf("invalid field mask: %s", f)) } } var dbMask, nullFields []string @@ -78,7 +78,7 @@ func (r *Repository) UpdateGroup(ctx context.Context, group *Group, version uint nil, ) if len(dbMask) == 0 && len(nullFields) == 0 { - return nil, nil, db.NoRowsAffected, errors.New(errors.EmptyFieldMask, op, "empty field mask") + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.EmptyFieldMask, op, "empty field mask") } var resource Resource var rowsUpdated int @@ -92,24 +92,24 @@ func (r *Repository) UpdateGroup(ctx context.Context, group *Group, version uint g := group.Clone().(*Group) resource, rowsUpdated, err = r.update(ctx, g, version, dbMask, nullFields) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } repo, err := NewRepository(read, w, r.kms) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } members, err = repo.ListGroupMembers(ctx, group.PublicId) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { if errors.IsUniqueError(err) { - return nil, nil, db.NoRowsAffected, errors.New(errors.NotUnique, op, fmt.Sprintf("group %s already exists in scope %s", group.Name, group.ScopeId)) + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("group %s already exists in scope %s", group.Name, group.ScopeId)) } - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("for group %s", group.PublicId))) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("for group %s", group.PublicId))) } return resource.(*Group), members, rowsUpdated, nil } @@ -119,7 +119,7 @@ func (r *Repository) UpdateGroup(ctx context.Context, group *Group, version uint func (r *Repository) LookupGroup(ctx context.Context, withPublicId string, _ ...Option) (*Group, []*GroupMember, error) { const op = "iam.(Repository).LookupGroup" if withPublicId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing public id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } g := allocGroup() g.PublicId = withPublicId @@ -130,15 +130,15 @@ func (r *Repository) LookupGroup(ctx context.Context, withPublicId string, _ ... db.ExpBackoff{}, func(read db.Reader, w db.Writer) error { if err := read.LookupByPublicId(ctx, &g); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } repo, err := NewRepository(read, w, r.kms) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } members, err = repo.ListGroupMembers(ctx, withPublicId) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, @@ -147,7 +147,7 @@ func (r *Repository) LookupGroup(ctx context.Context, withPublicId string, _ ... if errors.IsNotFoundError(err) { return nil, nil, nil } - return nil, nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("for group %s", withPublicId))) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("for group %s", withPublicId))) } return &g, members, nil } @@ -156,16 +156,16 @@ func (r *Repository) LookupGroup(ctx context.Context, withPublicId string, _ ... func (r *Repository) DeleteGroup(ctx context.Context, withPublicId string, _ ...Option) (int, error) { const op = "iam.(Repository).DeleteGroup" if withPublicId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing public id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } g := allocGroup() g.PublicId = withPublicId if err := r.reader.LookupByPublicId(ctx, &g); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("for group %s", withPublicId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("for group %s", withPublicId))) } rowsDeleted, err := r.delete(ctx, &g) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("for group %s", withPublicId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("for group %s", withPublicId))) } return rowsDeleted, nil } @@ -174,12 +174,12 @@ func (r *Repository) DeleteGroup(ctx context.Context, withPublicId string, _ ... func (r *Repository) ListGroups(ctx context.Context, withScopeIds []string, opt ...Option) ([]*Group, error) { const op = "iam.(Repository).ListGroups" if len(withScopeIds) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } var grps []*Group err := r.list(ctx, &grps, "scope_id in (?)", []interface{}{withScopeIds}, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return grps, nil } @@ -188,11 +188,11 @@ func (r *Repository) ListGroups(ctx context.Context, withScopeIds []string, opt func (r *Repository) ListGroupMembers(ctx context.Context, withGroupId string, opt ...Option) ([]*GroupMember, error) { const op = "iam.(Repository).ListGroupMembers" if withGroupId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing group id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing group id") } members := []*GroupMember{} if err := r.list(ctx, &members, "group_id = ?", []interface{}{withGroupId}, opt...); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return members, nil } @@ -204,33 +204,33 @@ func (r *Repository) ListGroupMembers(ctx context.Context, withGroupId string, o func (r *Repository) AddGroupMembers(ctx context.Context, groupId string, groupVersion uint32, userIds []string, _ ...Option) ([]*GroupMember, error) { const op = "iam.(Repository).AddGroupMembers" if groupId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing group id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing group id") } if len(userIds) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing user ids") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing user ids") } if groupVersion == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing version") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing version") } group := allocGroup() group.PublicId = groupId scope, err := group.GetScope(ctx, r.reader) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to get group members %s scope", groupId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to get group members %s scope", groupId))) } newGroupMembers := make([]interface{}, 0, len(userIds)) for _, id := range userIds { gm, err := NewGroupMemberUser(groupId, id) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create in memory group member")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory group member")) } newGroupMembers = append(newGroupMembers, gm) } oplogWrapper, err := r.kms.GetWrapper(ctx, scope.GetPublicId(), kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var currentMembers []*GroupMember @@ -242,7 +242,7 @@ func (r *Repository) AddGroupMembers(ctx context.Context, groupId string, groupV msgs := make([]*oplog.Message, 0, 2) groupTicket, err := w.GetTicket(&group) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } updatedGroup := allocGroup() updatedGroup.PublicId = groupId @@ -250,15 +250,15 @@ func (r *Repository) AddGroupMembers(ctx context.Context, groupId string, groupV var groupOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, &updatedGroup, []string{"Version"}, nil, db.NewOplogMsg(&groupOplogMsg), db.WithVersion(&groupVersion)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update group version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update group version")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated group and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated group and %d rows updated", rowsUpdated)) } msgs = append(msgs, &groupOplogMsg) memberOplogMsgs := make([]*oplog.Message, 0, len(newGroupMembers)) if err := w.CreateItems(ctx, newGroupMembers, db.NewOplogMsgs(&memberOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add users")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add users")) } msgs = append(msgs, memberOplogMsgs...) metadata := oplog.Metadata{ @@ -268,7 +268,7 @@ func (r *Repository) AddGroupMembers(ctx context.Context, groupId string, groupV "resource-public-id": []string{groupId}, } if err := w.WriteOplogEntryWith(ctx, oplogWrapper, groupTicket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } // we need a new repo, that's using the same reader/writer as this TxHandler txRepo := Repository{ @@ -280,13 +280,13 @@ func (r *Repository) AddGroupMembers(ctx context.Context, groupId string, groupV } currentMembers, err = txRepo.ListGroupMembers(ctx, groupId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current group members after sets")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current group members after sets")) } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return currentMembers, nil } @@ -297,33 +297,33 @@ func (r *Repository) AddGroupMembers(ctx context.Context, groupId string, groupV func (r *Repository) DeleteGroupMembers(ctx context.Context, groupId string, groupVersion uint32, userIds []string, _ ...Option) (int, error) { const op = "iam.(Repository).DeleteGroupMembers" if groupId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing group id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing group id") } if len(userIds) == 0 { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing either user or groups to delete") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing either user or groups to delete") } if groupVersion == 0 { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing version") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing version") } group := allocGroup() group.PublicId = groupId scope, err := group.GetScope(ctx, r.reader) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to get group members %s scope", groupId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to get group members %s scope", groupId))) } deleteMembers := make([]interface{}, 0, len(userIds)) for _, id := range userIds { member, err := NewGroupMemberUser(groupId, id) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to create in memory group member")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory group member")) } deleteMembers = append(deleteMembers, member) } oplogWrapper, err := r.kms.GetWrapper(ctx, scope.GetPublicId(), kms.KeyPurposeOplog) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var totalRowsDeleted int @@ -335,7 +335,7 @@ func (r *Repository) DeleteGroupMembers(ctx context.Context, groupId string, gro msgs := make([]*oplog.Message, 0, 2) groupTicket, err := w.GetTicket(&group) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } updatedGroup := allocGroup() updatedGroup.PublicId = groupId @@ -343,19 +343,19 @@ func (r *Repository) DeleteGroupMembers(ctx context.Context, groupId string, gro var groupOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, &updatedGroup, []string{"Version"}, nil, db.NewOplogMsg(&groupOplogMsg), db.WithVersion(&groupVersion)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update group version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update group version")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated group and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated group and %d rows updated", rowsUpdated)) } msgs = append(msgs, &groupOplogMsg) userOplogMsgs := make([]*oplog.Message, 0, len(deleteMembers)) rowsDeleted, err := w.DeleteItems(ctx, deleteMembers, db.NewOplogMsgs(&userOplogMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete group members")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete group members")) } if rowsDeleted != len(deleteMembers) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("group members deleted %d did not match request for %d", rowsDeleted, len(deleteMembers))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("group members deleted %d did not match request for %d", rowsDeleted, len(deleteMembers))) } totalRowsDeleted += rowsDeleted msgs = append(msgs, userOplogMsgs...) @@ -366,13 +366,13 @@ func (r *Repository) DeleteGroupMembers(ctx context.Context, groupId string, gro "resource-public-id": []string{groupId}, } if err := w.WriteOplogEntryWith(ctx, oplogWrapper, groupTicket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op) + return db.NoRowsAffected, errors.Wrap(ctx, err, op) } return totalRowsDeleted, nil } @@ -383,21 +383,21 @@ func (r *Repository) DeleteGroupMembers(ctx context.Context, groupId string, gro func (r *Repository) SetGroupMembers(ctx context.Context, groupId string, groupVersion uint32, userIds []string, _ ...Option) ([]*GroupMember, int, error) { const op = "iam.(Repository).SetGroupMembers" if groupId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing group id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing group id") } if groupVersion == 0 { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing version") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing version") } group := allocGroup() group.PublicId = groupId scope, err := group.GetScope(ctx, r.reader) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to get group members %s scope", groupId))) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to get group members %s scope", groupId))) } oplogWrapper, err := r.kms.GetWrapper(ctx, scope.GetPublicId(), kms.KeyPurposeOplog) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var currentMembers []*GroupMember @@ -417,13 +417,13 @@ func (r *Repository) SetGroupMembers(ctx context.Context, groupId string, groupV } addMembers, deleteMembers, err := groupMemberChanges(ctx, reader, groupId, userIds) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } // handle no change to existing group members if len(addMembers) == 0 && len(deleteMembers) == 0 { currentMembers, err = txRepo.ListGroupMembers(ctx, groupId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current group members after sets")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current group members after sets")) } return nil } @@ -440,7 +440,7 @@ func (r *Repository) SetGroupMembers(ctx context.Context, groupId string, groupV // we need to write oplog entries for deletes and adds groupTicket, err := w.GetTicket(&group) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } updatedGroup := allocGroup() updatedGroup.PublicId = groupId @@ -448,19 +448,19 @@ func (r *Repository) SetGroupMembers(ctx context.Context, groupId string, groupV var groupOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, &updatedGroup, []string{"Version"}, nil, db.NewOplogMsg(&groupOplogMsg), db.WithVersion(&groupVersion)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update group verison")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update group verison")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated group and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated group and %d rows updated", rowsUpdated)) } if len(deleteMembers) > 0 { userOplogMsgs := make([]*oplog.Message, 0, len(deleteMembers)) rowsDeleted, err := w.DeleteItems(ctx, deleteMembers, db.NewOplogMsgs(&userOplogMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete group member")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete group member")) } if rowsDeleted != len(deleteMembers) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("members deleted %d did not match request for %d", rowsDeleted, len(deleteMembers))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("members deleted %d did not match request for %d", rowsDeleted, len(deleteMembers))) } totalRowsAffected += rowsDeleted msgs = append(msgs, userOplogMsgs...) @@ -469,7 +469,7 @@ func (r *Repository) SetGroupMembers(ctx context.Context, groupId string, groupV if len(addMembers) > 0 { userOplogMsgs := make([]*oplog.Message, 0, len(addMembers)) if err := w.CreateItems(ctx, addMembers, db.NewOplogMsgs(&userOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add users")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add users")) } totalRowsAffected += len(addMembers) msgs = append(msgs, userOplogMsgs...) @@ -479,16 +479,16 @@ func (r *Repository) SetGroupMembers(ctx context.Context, groupId string, groupV // we're done with all the membership writes, so let's write the // group's update oplog message if err := w.WriteOplogEntryWith(ctx, oplogWrapper, groupTicket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } currentMembers, err = txRepo.ListGroupMembers(ctx, groupId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current group members after set")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current group members after set")) } return nil }) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } return currentMembers, totalRowsAffected, nil } @@ -514,7 +514,7 @@ func groupMemberChanges(ctx context.Context, reader db.Reader, groupId string, u } rows, err := reader.Query(ctx, query, params) if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } defer rows.Close() @@ -526,7 +526,7 @@ func groupMemberChanges(ctx context.Context, reader db.Reader, groupId string, u for rows.Next() { var chg change if err := reader.ScanRows(rows, &chg); err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } changes = append(changes, &chg) } @@ -534,23 +534,23 @@ func groupMemberChanges(ctx context.Context, reader db.Reader, groupId string, u deleteMembers := []interface{}{} for _, c := range changes { if c.MemberId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing user id in change result") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing user id in change result") } switch c.Action { case "add": gm, err := NewGroupMemberUser(groupId, c.MemberId) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to create in memory group member for add")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory group member for add")) } addMembers = append(addMembers, gm) case "delete": gm, err := NewGroupMemberUser(groupId, c.MemberId) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to create in memory group member for delete")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory group member for delete")) } deleteMembers = append(deleteMembers, gm) default: - return nil, nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("unknown action %s for %s", c.Action, c.MemberId)) + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("unknown action %s for %s", c.Action, c.MemberId)) } } diff --git a/internal/iam/repository_principal_role.go b/internal/iam/repository_principal_role.go index e412313bd..98f67148c 100644 --- a/internal/iam/repository_principal_role.go +++ b/internal/iam/repository_principal_role.go @@ -20,24 +20,24 @@ import ( func (r *Repository) AddPrincipalRoles(ctx context.Context, roleId string, roleVersion uint32, principalIds []string, _ ...Option) ([]PrincipalRole, error) { const op = "iam.(Repository).AddPrincipalRoles" if roleId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing role id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing role id") } if roleVersion == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing version") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing version") } - userIds, groupIds, managedGroupIds, err := splitPrincipals(principalIds) + userIds, groupIds, managedGroupIds, err := splitPrincipals(ctx, principalIds) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if len(userIds) == 0 && len(groupIds) == 0 && len(managedGroupIds) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing any of users, groups, or managed groups to add") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing any of users, groups, or managed groups to add") } newUserRoles := make([]interface{}, 0, len(userIds)) for _, id := range userIds { usrRole, err := NewUserRole(roleId, id) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create in memory user role")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory user role")) } newUserRoles = append(newUserRoles, usrRole) } @@ -45,7 +45,7 @@ func (r *Repository) AddPrincipalRoles(ctx context.Context, roleId string, roleV for _, id := range groupIds { grpRole, err := NewGroupRole(roleId, id) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create in memory group role")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory group role")) } newGrpRoles = append(newGrpRoles, grpRole) } @@ -53,7 +53,7 @@ func (r *Repository) AddPrincipalRoles(ctx context.Context, roleId string, roleV for _, id := range managedGroupIds { managedGrpRole, err := NewManagedGroupRole(roleId, id) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create in memory managed group role")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory managed group role")) } newManagedGrpRoles = append(newManagedGrpRoles, managedGrpRole) } @@ -62,12 +62,12 @@ func (r *Repository) AddPrincipalRoles(ctx context.Context, roleId string, roleV role.PublicId = roleId scope, err := role.GetScope(ctx, r.reader) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to get role %s scope", roleId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to get role %s scope", roleId))) } oplogWrapper, err := r.kms.GetWrapper(ctx, scope.GetPublicId(), kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var currentPrincipals []PrincipalRole @@ -79,7 +79,7 @@ func (r *Repository) AddPrincipalRoles(ctx context.Context, roleId string, roleV msgs := make([]*oplog.Message, 0, 2) roleTicket, err := w.GetTicket(&role) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } updatedRole := allocRole() updatedRole.PublicId = roleId @@ -87,30 +87,30 @@ func (r *Repository) AddPrincipalRoles(ctx context.Context, roleId string, roleV var roleOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, &updatedRole, []string{"Version"}, nil, db.NewOplogMsg(&roleOplogMsg), db.WithVersion(&roleVersion)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update role version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update role version")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated role and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated role and %d rows updated", rowsUpdated)) } msgs = append(msgs, &roleOplogMsg) if len(newUserRoles) > 0 { userOplogMsgs := make([]*oplog.Message, 0, len(newUserRoles)) if err := w.CreateItems(ctx, newUserRoles, db.NewOplogMsgs(&userOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add users")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add users")) } msgs = append(msgs, userOplogMsgs...) } if len(newGrpRoles) > 0 { grpOplogMsgs := make([]*oplog.Message, 0, len(newGrpRoles)) if err := w.CreateItems(ctx, newGrpRoles, db.NewOplogMsgs(&grpOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add groups")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add groups")) } msgs = append(msgs, grpOplogMsgs...) } if len(newManagedGrpRoles) > 0 { managedGrpOplogMsgs := make([]*oplog.Message, 0, len(newManagedGrpRoles)) if err := w.CreateItems(ctx, newManagedGrpRoles, db.NewOplogMsgs(&managedGrpOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add managed groups")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add managed groups")) } msgs = append(msgs, managedGrpOplogMsgs...) } @@ -121,7 +121,7 @@ func (r *Repository) AddPrincipalRoles(ctx context.Context, roleId string, roleV "resource-public-id": []string{roleId}, } if err := w.WriteOplogEntryWith(ctx, oplogWrapper, roleTicket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } // we need a new repo, that's using the same reader/writer as this TxHandler txRepo := &Repository{ @@ -133,13 +133,13 @@ func (r *Repository) AddPrincipalRoles(ctx context.Context, roleId string, roleV } currentPrincipals, err = txRepo.ListPrincipalRoles(ctx, roleId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current principal roles after adds")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current principal roles after adds")) } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return currentPrincipals, nil } @@ -152,10 +152,10 @@ func (r *Repository) AddPrincipalRoles(ctx context.Context, roleId string, roleV func (r *Repository) SetPrincipalRoles(ctx context.Context, roleId string, roleVersion uint32, principalIds []string, _ ...Option) ([]PrincipalRole, int, error) { const op = "iam.(Repository).SetPrincipalRoles" if roleId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing role id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing role id") } if roleVersion == 0 { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing version") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing version") } role := allocRole() role.PublicId = roleId @@ -163,13 +163,13 @@ func (r *Repository) SetPrincipalRoles(ctx context.Context, roleId string, roleV // it's "safe" to do this lookup outside the DoTx transaction because we // have a roleVersion so the principals can’t change without the version // changing. - userIds, groupIds, managedGroupIds, err := splitPrincipals(principalIds) + userIds, groupIds, managedGroupIds, err := splitPrincipals(ctx, principalIds) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } toSet, err := r.PrincipalsToSet(ctx, &role, userIds, groupIds, managedGroupIds) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } // handle no change to existing principal roles @@ -179,11 +179,11 @@ func (r *Repository) SetPrincipalRoles(ctx context.Context, roleId string, roleV scope, err := role.GetScope(ctx, r.reader) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to get role %s scope", roleId))) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to get role %s scope", roleId))) } oplogWrapper, err := r.kms.GetWrapper(ctx, scope.GetPublicId(), kms.KeyPurposeOplog) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var currentPrincipals []PrincipalRole @@ -198,7 +198,7 @@ func (r *Repository) SetPrincipalRoles(ctx context.Context, roleId string, roleV // we need to write oplog entries for deletes and adds roleTicket, err := w.GetTicket(&role) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket for role")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket for role")) } updatedRole := allocRole() updatedRole.PublicId = roleId @@ -206,10 +206,10 @@ func (r *Repository) SetPrincipalRoles(ctx context.Context, roleId string, roleV var roleOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, &updatedRole, []string{"Version"}, nil, db.NewOplogMsg(&roleOplogMsg), db.WithVersion(&roleVersion)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated role and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated role and %d rows updated", rowsUpdated)) } msgs := make([]*oplog.Message, 0, 5) metadata := oplog.Metadata{ @@ -228,10 +228,10 @@ func (r *Repository) SetPrincipalRoles(ctx context.Context, roleId string, roleV userOplogMsgs := make([]*oplog.Message, 0, len(toSet.DeleteUserRoles)) rowsDeleted, err := w.DeleteItems(ctx, toSet.DeleteUserRoles, db.NewOplogMsgs(&userOplogMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete user roles")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete user roles")) } if rowsDeleted != len(toSet.DeleteUserRoles) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("user roles deleted %d did not match request for %d", rowsDeleted, len(toSet.DeleteUserRoles))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("user roles deleted %d did not match request for %d", rowsDeleted, len(toSet.DeleteUserRoles))) } totalRowsAffected += rowsDeleted msgs = append(msgs, userOplogMsgs...) @@ -240,10 +240,10 @@ func (r *Repository) SetPrincipalRoles(ctx context.Context, roleId string, roleV grpOplogMsgs := make([]*oplog.Message, 0, len(toSet.DeleteGroupRoles)) rowsDeleted, err := w.DeleteItems(ctx, toSet.DeleteGroupRoles, db.NewOplogMsgs(&grpOplogMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete groups")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete groups")) } if rowsDeleted != len(toSet.DeleteGroupRoles) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("group roles deleted %d did not match request for %d", rowsDeleted, len(toSet.DeleteGroupRoles))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("group roles deleted %d did not match request for %d", rowsDeleted, len(toSet.DeleteGroupRoles))) } totalRowsAffected += rowsDeleted msgs = append(msgs, grpOplogMsgs...) @@ -252,10 +252,10 @@ func (r *Repository) SetPrincipalRoles(ctx context.Context, roleId string, roleV managedGrpOplogMsgs := make([]*oplog.Message, 0, len(toSet.DeleteManagedGroupRoles)) rowsDeleted, err := w.DeleteItems(ctx, toSet.DeleteManagedGroupRoles, db.NewOplogMsgs(&managedGrpOplogMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete managed groups")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete managed groups")) } if rowsDeleted != len(toSet.DeleteManagedGroupRoles) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("managed group roles deleted %d did not match request for %d", rowsDeleted, len(toSet.DeleteManagedGroupRoles))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("managed group roles deleted %d did not match request for %d", rowsDeleted, len(toSet.DeleteManagedGroupRoles))) } totalRowsAffected += rowsDeleted msgs = append(msgs, managedGrpOplogMsgs...) @@ -268,7 +268,7 @@ func (r *Repository) SetPrincipalRoles(ctx context.Context, roleId string, roleV if len(toSet.AddUserRoles) > 0 { userOplogMsgs := make([]*oplog.Message, 0, len(toSet.AddUserRoles)) if err := w.CreateItems(ctx, toSet.AddUserRoles, db.NewOplogMsgs(&userOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add users")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add users")) } totalRowsAffected += len(toSet.AddUserRoles) msgs = append(msgs, userOplogMsgs...) @@ -276,7 +276,7 @@ func (r *Repository) SetPrincipalRoles(ctx context.Context, roleId string, roleV if len(toSet.AddGroupRoles) > 0 { grpOplogMsgs := make([]*oplog.Message, 0, len(toSet.AddGroupRoles)) if err := w.CreateItems(ctx, toSet.AddGroupRoles, db.NewOplogMsgs(&grpOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add groups")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add groups")) } totalRowsAffected += len(toSet.AddGroupRoles) msgs = append(msgs, grpOplogMsgs...) @@ -284,14 +284,14 @@ func (r *Repository) SetPrincipalRoles(ctx context.Context, roleId string, roleV if len(toSet.AddManagedGroupRoles) > 0 { managedGrpOplogMsgs := make([]*oplog.Message, 0, len(toSet.AddManagedGroupRoles)) if err := w.CreateItems(ctx, toSet.AddManagedGroupRoles, db.NewOplogMsgs(&managedGrpOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add managed groups")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add managed groups")) } totalRowsAffected += len(toSet.AddManagedGroupRoles) msgs = append(msgs, managedGrpOplogMsgs...) } } if err := w.WriteOplogEntryWith(ctx, oplogWrapper, roleTicket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } // we need a new repo, that's using the same reader/writer as this TxHandler txRepo := &Repository{ @@ -303,12 +303,12 @@ func (r *Repository) SetPrincipalRoles(ctx context.Context, roleId string, roleV } currentPrincipals, err = txRepo.ListPrincipalRoles(ctx, roleId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current principal roles after sets")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current principal roles after sets")) } return nil }) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } return currentPrincipals, totalRowsAffected, nil } @@ -320,17 +320,17 @@ func (r *Repository) SetPrincipalRoles(ctx context.Context, roleId string, roleV func (r *Repository) DeletePrincipalRoles(ctx context.Context, roleId string, roleVersion uint32, principalIds []string, _ ...Option) (int, error) { const op = "iam.(Repository).DeletePrincipalRoles" if roleId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing role id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing role id") } - userIds, groupIds, managedGroupIds, err := splitPrincipals(principalIds) + userIds, groupIds, managedGroupIds, err := splitPrincipals(ctx, principalIds) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op) + return db.NoRowsAffected, errors.Wrap(ctx, err, op) } if len(userIds) == 0 && len(groupIds) == 0 && len(managedGroupIds) == 0 { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing any of users, groups, or managed groups to delete") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing any of users, groups, or managed groups to delete") } if roleVersion == 0 { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing version") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing version") } role := allocRole() role.PublicId = roleId @@ -339,7 +339,7 @@ func (r *Repository) DeletePrincipalRoles(ctx context.Context, roleId string, ro for _, id := range userIds { usrRole, err := NewUserRole(roleId, id) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to create in memory user role")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory user role")) } deleteUserRoles = append(deleteUserRoles, usrRole) } @@ -347,7 +347,7 @@ func (r *Repository) DeletePrincipalRoles(ctx context.Context, roleId string, ro for _, id := range groupIds { grpRole, err := NewGroupRole(roleId, id) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to create in memory group role")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory group role")) } deleteGrpRoles = append(deleteGrpRoles, grpRole) } @@ -355,18 +355,18 @@ func (r *Repository) DeletePrincipalRoles(ctx context.Context, roleId string, ro for _, id := range managedGroupIds { managedGrpRole, err := NewManagedGroupRole(roleId, id) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to create in memory managed group role")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory managed group role")) } deleteManagedGrpRoles = append(deleteManagedGrpRoles, managedGrpRole) } scope, err := role.GetScope(ctx, r.reader) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to get role %s scope to create metadata", roleId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to get role %s scope to create metadata", roleId))) } oplogWrapper, err := r.kms.GetWrapper(ctx, scope.GetPublicId(), kms.KeyPurposeOplog) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var totalRowsDeleted int @@ -378,7 +378,7 @@ func (r *Repository) DeletePrincipalRoles(ctx context.Context, roleId string, ro msgs := make([]*oplog.Message, 0, 2) roleTicket, err := w.GetTicket(&role) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } updatedRole := allocRole() updatedRole.PublicId = roleId @@ -386,20 +386,20 @@ func (r *Repository) DeletePrincipalRoles(ctx context.Context, roleId string, ro var roleOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, &updatedRole, []string{"Version"}, nil, db.NewOplogMsg(&roleOplogMsg), db.WithVersion(&roleVersion)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update role version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update role version")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated role and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated role and %d rows updated", rowsUpdated)) } msgs = append(msgs, &roleOplogMsg) if len(deleteUserRoles) > 0 { userOplogMsgs := make([]*oplog.Message, 0, len(deleteUserRoles)) rowsDeleted, err := w.DeleteItems(ctx, deleteUserRoles, db.NewOplogMsgs(&userOplogMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete user roles")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete user roles")) } if rowsDeleted != len(deleteUserRoles) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("user roles deleted %d did not match request for %d", rowsDeleted, len(deleteUserRoles))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("user roles deleted %d did not match request for %d", rowsDeleted, len(deleteUserRoles))) } totalRowsDeleted += rowsDeleted msgs = append(msgs, userOplogMsgs...) @@ -408,10 +408,10 @@ func (r *Repository) DeletePrincipalRoles(ctx context.Context, roleId string, ro grpOplogMsgs := make([]*oplog.Message, 0, len(deleteGrpRoles)) rowsDeleted, err := w.DeleteItems(ctx, deleteGrpRoles, db.NewOplogMsgs(&grpOplogMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete groups")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete groups")) } if rowsDeleted != len(deleteGrpRoles) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("group roles deleted %d did not match request for %d", rowsDeleted, len(deleteGrpRoles))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("group roles deleted %d did not match request for %d", rowsDeleted, len(deleteGrpRoles))) } totalRowsDeleted += rowsDeleted msgs = append(msgs, grpOplogMsgs...) @@ -420,10 +420,10 @@ func (r *Repository) DeletePrincipalRoles(ctx context.Context, roleId string, ro managedGrpOplogMsgs := make([]*oplog.Message, 0, len(deleteManagedGrpRoles)) rowsDeleted, err := w.DeleteItems(ctx, deleteManagedGrpRoles, db.NewOplogMsgs(&managedGrpOplogMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete managed groups")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete managed groups")) } if rowsDeleted != len(deleteManagedGrpRoles) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("managed group roles deleted %d did not match request for %d", rowsDeleted, len(deleteManagedGrpRoles))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("managed group roles deleted %d did not match request for %d", rowsDeleted, len(deleteManagedGrpRoles))) } totalRowsDeleted += rowsDeleted msgs = append(msgs, managedGrpOplogMsgs...) @@ -435,13 +435,13 @@ func (r *Repository) DeletePrincipalRoles(ctx context.Context, roleId string, ro "resource-public-id": []string{roleId}, } if err := w.WriteOplogEntryWith(ctx, oplogWrapper, roleTicket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op) + return db.NoRowsAffected, errors.Wrap(ctx, err, op) } return totalRowsDeleted, nil } @@ -450,11 +450,11 @@ func (r *Repository) DeletePrincipalRoles(ctx context.Context, roleId string, ro func (r *Repository) ListPrincipalRoles(ctx context.Context, roleId string, opt ...Option) ([]PrincipalRole, error) { const op = "iam.(Repository).ListPrincipalRoles" if roleId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing role id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing role id") } var roles []PrincipalRole if err := r.list(ctx, &roles, "role_id = ?", []interface{}{roleId}, opt...); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to lookup roles")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to lookup roles")) } principals := make([]PrincipalRole, 0, len(roles)) principals = append(principals, roles...) @@ -479,11 +479,11 @@ func (r *Repository) PrincipalsToSet(ctx context.Context, role *Role, userIds, g const op = "iam.(Repository).PrincipalsToSet" // TODO(mgaffney) 08/2020: Use SQL to calculate changes. if role == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing role") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing role") } existing, err := r.ListPrincipalRoles(ctx, role.PublicId) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to list existing principal role %s", role.PublicId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to list existing principal role %s", role.PublicId))) } existingUsers := map[string]PrincipalRole{} existingGroups := map[string]PrincipalRole{} @@ -497,7 +497,7 @@ func (r *Repository) PrincipalsToSet(ctx context.Context, role *Role, userIds, g case ManagedGroupRoleType.String(): existingManagedGroups[p.PrincipalId] = p default: - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("%s is unknown principal type %s", p.PrincipalId, p.GetType())) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s is unknown principal type %s", p.PrincipalId, p.GetType())) } } var newUserRoles []interface{} @@ -507,7 +507,7 @@ func (r *Repository) PrincipalsToSet(ctx context.Context, role *Role, userIds, g if _, ok := existingUsers[id]; !ok { usrRole, err := NewUserRole(role.PublicId, id) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create in memory user role for add")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory user role for add")) } newUserRoles = append(newUserRoles, usrRole) } @@ -519,7 +519,7 @@ func (r *Repository) PrincipalsToSet(ctx context.Context, role *Role, userIds, g if _, ok := existingGroups[id]; !ok { grpRole, err := NewGroupRole(role.PublicId, id) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create in memory group role for add")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory group role for add")) } newGrpRoles = append(newGrpRoles, grpRole) } @@ -531,7 +531,7 @@ func (r *Repository) PrincipalsToSet(ctx context.Context, role *Role, userIds, g if _, ok := existingManagedGroups[id]; !ok { managedGrpRole, err := NewManagedGroupRole(role.PublicId, id) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create in memory managed group role for add")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory managed group role for add")) } newManagedGrpRoles = append(newManagedGrpRoles, managedGrpRole) } @@ -541,7 +541,7 @@ func (r *Repository) PrincipalsToSet(ctx context.Context, role *Role, userIds, g if _, ok := userIdsMap[p.PrincipalId]; !ok { usrRole, err := NewUserRole(p.GetRoleId(), p.GetPrincipalId()) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create in memory user role for delete")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory user role for delete")) } deleteUserRoles = append(deleteUserRoles, usrRole) } @@ -551,7 +551,7 @@ func (r *Repository) PrincipalsToSet(ctx context.Context, role *Role, userIds, g if _, ok := groupIdsMap[p.PrincipalId]; !ok { grpRole, err := NewGroupRole(p.GetRoleId(), p.GetPrincipalId()) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create in memory group role for delete")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory group role for delete")) } deleteGrpRoles = append(deleteGrpRoles, grpRole) } @@ -561,7 +561,7 @@ func (r *Repository) PrincipalsToSet(ctx context.Context, role *Role, userIds, g if _, ok := managedGroupIdsMap[p.PrincipalId]; !ok { managedGrpRole, err := NewManagedGroupRole(p.GetRoleId(), p.GetPrincipalId()) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create in memory managed group role for delete")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory managed group role for delete")) } deleteManagedGrpRoles = append(deleteManagedGrpRoles, managedGrpRole) } @@ -588,7 +588,7 @@ func (r *Repository) PrincipalsToSet(ctx context.Context, role *Role, userIds, g return toSet, nil } -func splitPrincipals(principals []string) (users, groups, managedGroups []string, retErr error) { +func splitPrincipals(ctx context.Context, principals []string) (users, groups, managedGroups []string, retErr error) { const op = "iam.splitPrincipals" for _, principal := range principals { switch { @@ -608,7 +608,7 @@ func splitPrincipals(principals []string) (users, groups, managedGroups []string } managedGroups = append(managedGroups, principal) default: - return nil, nil, nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("invalid principal ID %q", principal)) + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("invalid principal ID %q", principal)) } } diff --git a/internal/iam/repository_role.go b/internal/iam/repository_role.go index 62a1f3365..ebd21a0b6 100644 --- a/internal/iam/repository_role.go +++ b/internal/iam/repository_role.go @@ -15,29 +15,29 @@ import ( func (r *Repository) CreateRole(ctx context.Context, role *Role, _ ...Option) (*Role, error) { const op = "iam.(Repository).CreateRole" if role == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing role") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing role") } if role.Role == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing role store") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing role store") } if role.PublicId != "" { - return nil, errors.New(errors.InvalidParameter, op, "public id not empty") + return nil, errors.New(ctx, errors.InvalidParameter, op, "public id not empty") } if role.ScopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } id, err := newRoleId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } c := role.Clone().(*Role) c.PublicId = id resource, err := r.create(ctx, c) if err != nil { if errors.IsUniqueError(err) { - return nil, errors.New(errors.NotUnique, op, fmt.Sprintf("role %s already exists in scope %s", role.Name, role.ScopeId)) + return nil, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("role %s already exists in scope %s", role.Name, role.ScopeId)) } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("for %s", c.PublicId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("for %s", c.PublicId))) } return resource.(*Role), nil } @@ -51,13 +51,13 @@ func (r *Repository) CreateRole(ctx context.Context, role *Role, _ ...Option) (* func (r *Repository) UpdateRole(ctx context.Context, role *Role, version uint32, fieldMaskPaths []string, _ ...Option) (*Role, []PrincipalRole, []*RoleGrant, int, error) { const op = "iam.(Repository).UpdateRole" if role == nil { - return nil, nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing role") + return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing role") } if role.Role == nil { - return nil, nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing role store") + return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing role store") } if role.PublicId == "" { - return nil, nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing public id") + return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } for _, f := range fieldMaskPaths { switch { @@ -65,7 +65,7 @@ func (r *Repository) UpdateRole(ctx context.Context, role *Role, version uint32, case strings.EqualFold("description", f): case strings.EqualFold("grantscopeid", f): default: - return nil, nil, nil, db.NoRowsAffected, errors.New(errors.InvalidFieldMask, op, fmt.Sprintf("invalid field mask: %s", f)) + return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidFieldMask, op, fmt.Sprintf("invalid field mask: %s", f)) } } var dbMask, nullFields []string @@ -79,7 +79,7 @@ func (r *Repository) UpdateRole(ctx context.Context, role *Role, version uint32, nil, ) if len(dbMask) == 0 && len(nullFields) == 0 { - return nil, nil, nil, db.NoRowsAffected, errors.E(errors.WithCode(errors.EmptyFieldMask), errors.WithOp(op)) + return nil, nil, nil, db.NoRowsAffected, errors.E(ctx, errors.WithCode(errors.EmptyFieldMask), errors.WithOp(op)) } var resource Resource var rowsUpdated int @@ -94,28 +94,28 @@ func (r *Repository) UpdateRole(ctx context.Context, role *Role, version uint32, c := role.Clone().(*Role) resource, rowsUpdated, err = r.update(ctx, c, version, dbMask, nullFields) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } repo, err := NewRepository(read, w, r.kms) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } pr, err = repo.ListPrincipalRoles(ctx, role.PublicId) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } rg, err = repo.ListRoleGrants(ctx, role.PublicId) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { if errors.IsUniqueError(err) { - return nil, nil, nil, db.NoRowsAffected, errors.New(errors.NotUnique, op, fmt.Sprintf("role %s already exists in org %s", role.Name, role.ScopeId)) + return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("role %s already exists in org %s", role.Name, role.ScopeId)) } - return nil, nil, nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("for %s", role.PublicId))) + return nil, nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("for %s", role.PublicId))) } return resource.(*Role), pr, rg, rowsUpdated, nil } @@ -125,7 +125,7 @@ func (r *Repository) UpdateRole(ctx context.Context, role *Role, version uint32, func (r *Repository) LookupRole(ctx context.Context, withPublicId string, _ ...Option) (*Role, []PrincipalRole, []*RoleGrant, error) { const op = "iam.(Repository).LookupRole" if withPublicId == "" { - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "missing public id") + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } role := allocRole() role.PublicId = withPublicId @@ -137,19 +137,19 @@ func (r *Repository) LookupRole(ctx context.Context, withPublicId string, _ ...O db.ExpBackoff{}, func(read db.Reader, w db.Writer) error { if err := read.LookupByPublicId(ctx, &role); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } repo, err := NewRepository(read, w, r.kms) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } pr, err = repo.ListPrincipalRoles(ctx, withPublicId) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } rg, err = repo.ListRoleGrants(ctx, withPublicId) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, @@ -158,7 +158,7 @@ func (r *Repository) LookupRole(ctx context.Context, withPublicId string, _ ...O if errors.IsNotFoundError(err) { return nil, nil, nil, nil } - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("for %s", withPublicId))) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("for %s", withPublicId))) } return &role, pr, rg, nil } @@ -167,16 +167,16 @@ func (r *Repository) LookupRole(ctx context.Context, withPublicId string, _ ...O func (r *Repository) DeleteRole(ctx context.Context, withPublicId string, _ ...Option) (int, error) { const op = "iam.(Repository).DeleteRole" if withPublicId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing public id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } role := allocRole() role.PublicId = withPublicId if err := r.reader.LookupByPublicId(ctx, &role); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", withPublicId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", withPublicId))) } rowsDeleted, err := r.delete(ctx, &role) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", withPublicId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", withPublicId))) } return rowsDeleted, nil } @@ -185,12 +185,12 @@ func (r *Repository) DeleteRole(ctx context.Context, withPublicId string, _ ...O func (r *Repository) ListRoles(ctx context.Context, withScopeIds []string, opt ...Option) ([]*Role, error) { const op = "iam.(Repository).ListRoles" if len(withScopeIds) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing scope ids") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope ids") } var roles []*Role err := r.list(ctx, &roles, "scope_id in (?)", []interface{}{withScopeIds}, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return roles, nil } diff --git a/internal/iam/repository_role_grant.go b/internal/iam/repository_role_grant.go index 498cddda9..923cce7de 100644 --- a/internal/iam/repository_role_grant.go +++ b/internal/iam/repository_role_grant.go @@ -17,13 +17,13 @@ import ( func (r *Repository) AddRoleGrants(ctx context.Context, roleId string, roleVersion uint32, grants []string, _ ...Option) ([]*RoleGrant, error) { const op = "iam.(Repository).AddRoleGrants" if roleId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing role id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing role id") } if len(grants) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing grants") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing grants") } if roleVersion == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing version") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing version") } role := allocRole() role.PublicId = roleId @@ -32,18 +32,18 @@ func (r *Repository) AddRoleGrants(ctx context.Context, roleId string, roleVersi for _, grant := range grants { roleGrant, err := NewRoleGrant(roleId, grant) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create in memory role grant")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory role grant")) } newRoleGrants = append(newRoleGrants, roleGrant) } scope, err := role.GetScope(ctx, r.reader) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to get role %s scope", roleId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to get role %s scope", roleId))) } oplogWrapper, err := r.kms.GetWrapper(ctx, scope.GetPublicId(), kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } _, err = r.writer.DoTx( @@ -54,7 +54,7 @@ func (r *Repository) AddRoleGrants(ctx context.Context, roleId string, roleVersi msgs := make([]*oplog.Message, 0, 2) roleTicket, err := w.GetTicket(&role) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } // We need to update the role version as that's the aggregate @@ -64,15 +64,15 @@ func (r *Repository) AddRoleGrants(ctx context.Context, roleId string, roleVersi var roleOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, &updatedRole, []string{"Version"}, nil, db.NewOplogMsg(&roleOplogMsg), db.WithVersion(&roleVersion)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update role version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update role version")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated role and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated role and %d rows updated", rowsUpdated)) } msgs = append(msgs, &roleOplogMsg) roleGrantOplogMsgs := make([]*oplog.Message, 0, len(newRoleGrants)) if err := w.CreateItems(ctx, newRoleGrants, db.NewOplogMsgs(&roleGrantOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add grants")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add grants")) } msgs = append(msgs, roleGrantOplogMsgs...) @@ -83,14 +83,14 @@ func (r *Repository) AddRoleGrants(ctx context.Context, roleId string, roleVersi "resource-public-id": []string{roleId}, } if err := w.WriteOplogEntryWith(ctx, oplogWrapper, roleTicket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } roleGrants := make([]*RoleGrant, 0, len(newRoleGrants)) for _, grant := range newRoleGrants { @@ -106,24 +106,24 @@ func (r *Repository) AddRoleGrants(ctx context.Context, roleId string, roleVersi func (r *Repository) DeleteRoleGrants(ctx context.Context, roleId string, roleVersion uint32, grants []string, _ ...Option) (int, error) { const op = "iam.(Repository).DeleteRoleGrants" if roleId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing role id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing role id") } if len(grants) == 0 { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing grants") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing grants") } if roleVersion == 0 { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing version") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing version") } role := allocRole() role.PublicId = roleId scope, err := role.GetScope(ctx, r.reader) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to get role %s scope to create metadata", roleId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to get role %s scope to create metadata", roleId))) } oplogWrapper, err := r.kms.GetWrapper(ctx, scope.GetPublicId(), kms.KeyPurposeOplog) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var totalRowsDeleted int @@ -135,7 +135,7 @@ func (r *Repository) DeleteRoleGrants(ctx context.Context, roleId string, roleVe msgs := make([]*oplog.Message, 0, 2) roleTicket, err := w.GetTicket(&role) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } updatedRole := allocRole() updatedRole.PublicId = roleId @@ -143,17 +143,17 @@ func (r *Repository) DeleteRoleGrants(ctx context.Context, roleId string, roleVe var roleOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, &updatedRole, []string{"Version"}, nil, db.NewOplogMsg(&roleOplogMsg), db.WithVersion(&roleVersion)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update role version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update role version")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated role and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated role and %d rows updated", rowsUpdated)) } msgs = append(msgs, &roleOplogMsg) // Find existing grants roleGrants := []*RoleGrant{} if err := reader.SearchWhere(ctx, &roleGrants, "role_id = ?", []interface{}{roleId}); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to search for grants")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to search for grants")) } found := map[string]bool{} for _, rg := range roleGrants { @@ -167,7 +167,7 @@ func (r *Repository) DeleteRoleGrants(ctx context.Context, roleId string, roleVe // Use a fake scope, just want to get out a canonical string perm, err := perms.Parse("o_abcd1234", grant, perms.WithSkipFinalValidation(true)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("parsing grant string")) + return errors.Wrap(ctx, err, op, errors.WithMsg("parsing grant string")) } // We don't have what they want to delete, so ignore it if !found[perm.CanonicalString()] { @@ -176,7 +176,7 @@ func (r *Repository) DeleteRoleGrants(ctx context.Context, roleId string, roleVe roleGrant, err := NewRoleGrant(roleId, grant) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to create in memory role grant")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory role grant")) } deleteRoleGrants = append(deleteRoleGrants, roleGrant) } @@ -188,10 +188,10 @@ func (r *Repository) DeleteRoleGrants(ctx context.Context, roleId string, roleVe roleGrantOplogMsgs := make([]*oplog.Message, 0, len(deleteRoleGrants)) rowsDeleted, err := w.DeleteItems(ctx, deleteRoleGrants, db.NewOplogMsgs(&roleGrantOplogMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete role grant")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete role grant")) } if rowsDeleted != len(deleteRoleGrants) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("role grants deleted %d did not match request for %d", rowsDeleted, len(deleteRoleGrants))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("role grants deleted %d did not match request for %d", rowsDeleted, len(deleteRoleGrants))) } totalRowsDeleted = rowsDeleted msgs = append(msgs, roleGrantOplogMsgs...) @@ -203,14 +203,14 @@ func (r *Repository) DeleteRoleGrants(ctx context.Context, roleId string, roleVe "resource-public-id": []string{roleId}, } if err := w.WriteOplogEntryWith(ctx, oplogWrapper, roleTicket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op) + return db.NoRowsAffected, errors.Wrap(ctx, err, op) } return totalRowsDeleted, nil } @@ -221,15 +221,15 @@ func (r *Repository) DeleteRoleGrants(ctx context.Context, roleId string, roleVe func (r *Repository) SetRoleGrants(ctx context.Context, roleId string, roleVersion uint32, grants []string, _ ...Option) ([]*RoleGrant, int, error) { const op = "iam.(Repository).SetRoleGrants" if roleId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing role id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing role id") } if roleVersion == 0 { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing version") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing version") } // Explicitly set to zero clears, but treat nil as a mistake if grants == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing grants") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing grants") } role := allocRole() @@ -244,7 +244,7 @@ func (r *Repository) SetRoleGrants(ctx context.Context, roleId string, roleVersi // Find existing grants roleGrants := []*RoleGrant{} if err := r.reader.SearchWhere(ctx, &roleGrants, "role_id = ?", []interface{}{roleId}); err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to search for grants")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to search for grants")) } found := map[string]*RoleGrant{} for _, rg := range roleGrants { @@ -259,7 +259,7 @@ func (r *Repository) SetRoleGrants(ctx context.Context, roleId string, roleVersi // Use a fake scope, just want to get out a canonical string perm, err := perms.Parse("o_abcd1234", grant, perms.WithSkipFinalValidation(true)) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("error parsing grant string")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("error parsing grant string")) } canonicalString := perm.CanonicalString() @@ -275,7 +275,7 @@ func (r *Repository) SetRoleGrants(ctx context.Context, roleId string, roleVersi // Not found, so add rg, err = NewRoleGrant(roleId, grant) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to create in memory role grant")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory role grant")) } addRoleGrants = append(addRoleGrants, rg) currentRoleGrants = append(currentRoleGrants, rg) @@ -293,11 +293,11 @@ func (r *Repository) SetRoleGrants(ctx context.Context, roleId string, roleVersi scope, err := role.GetScope(ctx, r.reader) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to get role %s scope", roleId))) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to get role %s scope", roleId))) } oplogWrapper, err := r.kms.GetWrapper(ctx, scope.GetPublicId(), kms.KeyPurposeOplog) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var totalRowsDeleted int @@ -309,7 +309,7 @@ func (r *Repository) SetRoleGrants(ctx context.Context, roleId string, roleVersi msgs := make([]*oplog.Message, 0, 2) roleTicket, err := w.GetTicket(&role) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } updatedRole := allocRole() updatedRole.PublicId = roleId @@ -317,10 +317,10 @@ func (r *Repository) SetRoleGrants(ctx context.Context, roleId string, roleVersi var roleOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, &updatedRole, []string{"Version"}, nil, db.NewOplogMsg(&roleOplogMsg), db.WithVersion(&roleVersion)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update role version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update role version")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated role and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated role and %d rows updated", rowsUpdated)) } msgs = append(msgs, &roleOplogMsg) @@ -328,7 +328,7 @@ func (r *Repository) SetRoleGrants(ctx context.Context, roleId string, roleVersi if len(addRoleGrants) > 0 { roleGrantOplogMsgs := make([]*oplog.Message, 0, len(addRoleGrants)) if err := w.CreateItems(ctx, addRoleGrants, db.NewOplogMsgs(&roleGrantOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add grants during set")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add grants during set")) } msgs = append(msgs, roleGrantOplogMsgs...) } @@ -338,10 +338,10 @@ func (r *Repository) SetRoleGrants(ctx context.Context, roleId string, roleVersi roleGrantOplogMsgs := make([]*oplog.Message, 0, len(deleteRoleGrants)) rowsDeleted, err := w.DeleteItems(ctx, deleteRoleGrants, db.NewOplogMsgs(&roleGrantOplogMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete role grant")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete role grant")) } if rowsDeleted != len(deleteRoleGrants) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("role grants deleted %d did not match request for %d", rowsDeleted, len(deleteRoleGrants))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("role grants deleted %d did not match request for %d", rowsDeleted, len(deleteRoleGrants))) } totalRowsDeleted = rowsDeleted msgs = append(msgs, roleGrantOplogMsgs...) @@ -354,19 +354,19 @@ func (r *Repository) SetRoleGrants(ctx context.Context, roleId string, roleVersi "resource-public-id": []string{roleId}, } if err := w.WriteOplogEntryWith(ctx, oplogWrapper, roleTicket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } currentRoleGrants, err = r.ListRoleGrants(ctx, roleId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current role grants after set")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current role grants after set")) } return nil }, ) if err != nil { - return nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } return currentRoleGrants, totalRowsDeleted, nil } @@ -376,11 +376,11 @@ func (r *Repository) SetRoleGrants(ctx context.Context, roleId string, roleVersi func (r *Repository) ListRoleGrants(ctx context.Context, roleId string, opt ...Option) ([]*RoleGrant, error) { const op = "iam.(Repository).ListRoleGrants" if roleId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing role id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing role id") } var roleGrants []*RoleGrant if err := r.list(ctx, &roleGrants, "role_id = ?", []interface{}{roleId}, opt...); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to lookup role grants")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to lookup role grants")) } return roleGrants, nil } @@ -388,7 +388,7 @@ func (r *Repository) ListRoleGrants(ctx context.Context, roleId string, opt ...O func (r *Repository) GrantsForUser(ctx context.Context, userId string, _ ...Option) ([]perms.GrantTuple, error) { const op = "iam.(Repository).GrantsForUser" if userId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing user id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing user id") } const ( @@ -478,13 +478,13 @@ select role_id as role_id, role_scope as scope_id, role_grant as grant from fina var grants []perms.GrantTuple rows, err := r.reader.Query(ctx, query, []interface{}{userId}) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } defer rows.Close() for rows.Next() { var g perms.GrantTuple if err := r.reader.ScanRows(rows, &g); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } grants = append(grants, g) } diff --git a/internal/iam/repository_scope.go b/internal/iam/repository_scope.go index 51650c203..ddfc149f3 100644 --- a/internal/iam/repository_scope.go +++ b/internal/iam/repository_scope.go @@ -21,13 +21,13 @@ import ( func (r *Repository) CreateScope(ctx context.Context, s *Scope, userId string, opt ...Option) (*Scope, error) { const op = "iam.(Repository).CreateScope" if s == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing scope") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope") } if s.Scope == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing scope store") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope store") } if s.PublicId != "" { - return nil, errors.New(errors.InvalidParameter, op, "public id not empty") + return nil, errors.New(ctx, errors.InvalidParameter, op, "public id not empty") } var parentOplogWrapper wrapping.Wrapper @@ -35,13 +35,13 @@ func (r *Repository) CreateScope(ctx context.Context, s *Scope, userId string, o var err error switch s.Type { case scope.Unknown.String(): - return nil, errors.New(errors.InvalidParameter, op, "unknown type") + return nil, errors.New(ctx, errors.InvalidParameter, op, "unknown type") case scope.Global.String(): - return nil, errors.New(errors.InvalidParameter, op, "invalid type") + return nil, errors.New(ctx, errors.InvalidParameter, op, "invalid type") default: switch s.ParentId { case "": - return nil, errors.New(errors.InvalidParameter, op, "missing parent id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing parent id") case scope.Global.String(): parentOplogWrapper, err = r.kms.GetWrapper(ctx, scope.Global.String(), kms.KeyPurposeOplog) default: @@ -50,7 +50,7 @@ func (r *Repository) CreateScope(ctx context.Context, s *Scope, userId string, o externalWrappers = r.kms.GetExternalWrappers() } if err != nil { - return nil, errors.New(errors.InvalidParameter, op, "unable to get oplog wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "unable to get oplog wrapper") } opts := getOpts(opt...) @@ -62,13 +62,13 @@ func (r *Repository) CreateScope(ctx context.Context, s *Scope, userId string, o scopeType := scope.Map[s.Type] if opts.withPublicId != "" { if !strings.HasPrefix(opts.withPublicId, scopeType.Prefix()+"_") { - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("passed-in public ID %q has wrong prefix for type %q which uses prefix %q", opts.withPublicId, scopeType.String(), scopeType.Prefix())) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("passed-in public ID %q has wrong prefix for type %q which uses prefix %q", opts.withPublicId, scopeType.String(), scopeType.Prefix())) } scopePublicId = opts.withPublicId } else { scopePublicId, err = newScopeId(scopeType) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } } sc := s.Clone().(*Scope) @@ -76,7 +76,7 @@ func (r *Repository) CreateScope(ctx context.Context, s *Scope, userId string, o scopeRaw = sc scopeMetadata, err = r.stdMetadata(ctx, sc) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } scopeMetadata["op-type"] = []string{oplog.OpType_OP_TYPE_CREATE.String()} } @@ -103,11 +103,11 @@ func (r *Repository) CreateScope(ctx context.Context, s *Scope, userId string, o default: adminRole, err = NewRole(scopePublicId) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("error instantiating new admin role")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("error instantiating new admin role")) } adminRolePublicId, err = newRoleId() if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("error generating public id for new admin role")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("error generating public id for new admin role")) } adminRole.PublicId = adminRolePublicId adminRole.Name = "Administration" @@ -129,11 +129,11 @@ func (r *Repository) CreateScope(ctx context.Context, s *Scope, userId string, o if !opts.withSkipDefaultRoleCreation { defaultRole, err = NewRole(scopePublicId) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("error instantiating new default role")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("error instantiating new default role")) } defaultRolePublicId, err = newRoleId() if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("error generating public id for new default role")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("error generating public id for new default role")) } defaultRole.PublicId = defaultRolePublicId switch s.Type { @@ -169,7 +169,7 @@ func (r *Repository) CreateScope(ctx context.Context, s *Scope, userId string, o scopeRaw, db.WithOplog(parentOplogWrapper, scopeMetadata), ); err != nil { - return errors.Wrap(err, op, errors.WithMsg("error creating scope")) + return errors.Wrap(ctx, err, op, errors.WithMsg("error creating scope")) } s := scopeRaw.(*Scope) @@ -177,16 +177,16 @@ func (r *Repository) CreateScope(ctx context.Context, s *Scope, userId string, o // Create the scope's keys _, err = kms.CreateKeysTx(ctx, dbr, w, externalWrappers.Root(), reader, s.PublicId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("error creating scope keys")) + return errors.Wrap(ctx, err, op, errors.WithMsg("error creating scope keys")) } kmsRepo, err := kms.NewRepository(dbr, w) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("error creating new kms repo")) + return errors.Wrap(ctx, err, op, errors.WithMsg("error creating new kms repo")) } childOplogWrapper, err := r.kms.GetWrapper(ctx, s.PublicId, kms.KeyPurposeOplog, kms.WithRepository(kmsRepo)) if err != nil { - return errors.New(errors.InvalidParameter, op, "unable to get oplog wrapper") + return errors.New(ctx, errors.InvalidParameter, op, "unable to get oplog wrapper") } // We create a new role, then set grants and principals on it. This @@ -198,7 +198,7 @@ func (r *Repository) CreateScope(ctx context.Context, s *Scope, userId string, o adminRoleRaw, db.WithOplog(childOplogWrapper, adminRoleMetadata), ); err != nil { - return errors.Wrap(err, op, errors.WithMsg("error creating role")) + return errors.Wrap(ctx, err, op, errors.WithMsg("error creating role")) } adminRole = adminRoleRaw.(*Role) @@ -206,38 +206,38 @@ func (r *Repository) CreateScope(ctx context.Context, s *Scope, userId string, o msgs := make([]*oplog.Message, 0, 3) roleTicket, err := w.GetTicket(adminRole) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } // We need to update the role version as that's the aggregate var roleOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, adminRole, []string{"Version"}, nil, db.NewOplogMsg(&roleOplogMsg), db.WithVersion(&adminRole.Version)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update role version for adding grant")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update role version for adding grant")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated role but %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated role but %d rows updated", rowsUpdated)) } msgs = append(msgs, &roleOplogMsg) roleGrant, err := NewRoleGrant(adminRolePublicId, "id=*;type=*;actions=*") if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to create in memory role grant")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory role grant")) } roleGrantOplogMsgs := make([]*oplog.Message, 0, 1) if err := w.CreateItems(ctx, []interface{}{roleGrant}, db.NewOplogMsgs(&roleGrantOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add grants")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add grants")) } msgs = append(msgs, roleGrantOplogMsgs...) rolePrincipal, err := NewUserRole(adminRolePublicId, userId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to create in memory role user")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory role user")) } roleUserOplogMsgs := make([]*oplog.Message, 0, 1) if err := w.CreateItems(ctx, []interface{}{rolePrincipal}, db.NewOplogMsgs(&roleUserOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add grants")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add grants")) } msgs = append(msgs, roleUserOplogMsgs...) @@ -248,7 +248,7 @@ func (r *Repository) CreateScope(ctx context.Context, s *Scope, userId string, o "resource-public-id": []string{adminRole.PublicId}, } if err := w.WriteOplogEntryWith(ctx, childOplogWrapper, roleTicket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } } @@ -261,7 +261,7 @@ func (r *Repository) CreateScope(ctx context.Context, s *Scope, userId string, o defaultRoleRaw, db.WithOplog(childOplogWrapper, defaultRoleMetadata), ); err != nil { - return errors.Wrap(err, op, errors.WithMsg("error creating role")) + return errors.Wrap(ctx, err, op, errors.WithMsg("error creating role")) } defaultRole = defaultRoleRaw.(*Role) @@ -269,17 +269,17 @@ func (r *Repository) CreateScope(ctx context.Context, s *Scope, userId string, o msgs := make([]*oplog.Message, 0, 6) roleTicket, err := w.GetTicket(defaultRole) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } // We need to update the role version as that's the aggregate var roleOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, defaultRole, []string{"Version"}, nil, db.NewOplogMsg(&roleOplogMsg), db.WithVersion(&defaultRole.Version)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update role version for adding grant")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update role version for adding grant")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated role but %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated role but %d rows updated", rowsUpdated)) } msgs = append(msgs, &roleOplogMsg) @@ -291,39 +291,39 @@ func (r *Repository) CreateScope(ctx context.Context, s *Scope, userId string, o case scope.Project.String(): roleGrant, err := NewRoleGrant(defaultRolePublicId, "id=*;type=session;actions=list,read:self,cancel:self") if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to create in memory role grant")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory role grant")) } grants = append(grants, roleGrant) default: roleGrant, err := NewRoleGrant(defaultRolePublicId, "id=*;type=scope;actions=list,no-op") if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to create in memory role grant")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory role grant")) } grants = append(grants, roleGrant) roleGrant, err = NewRoleGrant(defaultRolePublicId, "id=*;type=auth-method;actions=authenticate,list") if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to create in memory role grant")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory role grant")) } grants = append(grants, roleGrant) roleGrant, err = NewRoleGrant(defaultRolePublicId, "id={{account.id}};actions=read,change-password") if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to create in memory role grant")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory role grant")) } grants = append(grants, roleGrant) roleGrant, err = NewRoleGrant(defaultRolePublicId, "id=*;type=auth-token;actions=list,read:self,delete:self") if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to create in memory role grant")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory role grant")) } grants = append(grants, roleGrant) } roleGrantOplogMsgs := make([]*oplog.Message, 0, 3) if err := w.CreateItems(ctx, grants, db.NewOplogMsgs(&roleGrantOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add grants")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add grants")) } msgs = append(msgs, roleGrantOplogMsgs...) } @@ -337,13 +337,13 @@ func (r *Repository) CreateScope(ctx context.Context, s *Scope, userId string, o } rolePrincipal, err := NewUserRole(defaultRolePublicId, userId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to create in memory role user")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory role user")) } principals = append(principals, rolePrincipal) roleUserOplogMsgs := make([]*oplog.Message, 0, 2) if err := w.CreateItems(ctx, principals, db.NewOplogMsgs(&roleUserOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add grants")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add grants")) } msgs = append(msgs, roleUserOplogMsgs...) } @@ -355,7 +355,7 @@ func (r *Repository) CreateScope(ctx context.Context, s *Scope, userId string, o "resource-public-id": []string{defaultRole.PublicId}, } if err := w.WriteOplogEntryWith(ctx, childOplogWrapper, roleTicket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } } @@ -365,9 +365,9 @@ func (r *Repository) CreateScope(ctx context.Context, s *Scope, userId string, o if err != nil { if errors.IsUniqueError(err) { - return nil, errors.New(errors.NotUnique, op, fmt.Sprintf("scope %s/%s already exists", scopePublicId, s.Name)) + return nil, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("scope %s/%s already exists", scopePublicId, s.Name)) } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("for %s", scopePublicId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("for %s", scopePublicId))) } return scopeRaw.(*Scope), nil } @@ -381,13 +381,13 @@ func (r *Repository) CreateScope(ctx context.Context, s *Scope, userId string, o func (r *Repository) UpdateScope(ctx context.Context, scope *Scope, version uint32, fieldMaskPaths []string, _ ...Option) (*Scope, int, error) { const op = "iam.(Repository).UpdateScope" if scope == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing scope") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing scope") } if scope.PublicId == "" { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing public id") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } if contains(fieldMaskPaths, "ParentId") { - return nil, db.NoRowsAffected, errors.New(errors.InvalidFieldMask, op, "you cannot change a scope's parent") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidFieldMask, op, "you cannot change a scope's parent") } var dbMask, nullFields []string dbMask, nullFields = dbcommon.BuildUpdatePaths( @@ -401,14 +401,14 @@ func (r *Repository) UpdateScope(ctx context.Context, scope *Scope, version uint ) // nada to update, so reload scope from db and return it if len(dbMask) == 0 && len(nullFields) == 0 { - return nil, db.NoRowsAffected, errors.E(errors.WithCode(errors.EmptyFieldMask), errors.WithOp(op)) + return nil, db.NoRowsAffected, errors.E(ctx, errors.WithCode(errors.EmptyFieldMask), errors.WithOp(op)) } resource, rowsUpdated, err := r.update(ctx, scope, version, dbMask, nullFields) if err != nil { if errors.IsUniqueError(err) { - return nil, db.NoRowsAffected, errors.New(errors.NotUnique, op, fmt.Sprintf("%s name %s already exists", scope.PublicId, scope.Name)) + return nil, db.NoRowsAffected, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("%s name %s already exists", scope.PublicId, scope.Name)) } - return nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("for public id %s", scope.PublicId))) + return nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("for public id %s", scope.PublicId))) } return resource.(*Scope), rowsUpdated, nil } @@ -418,7 +418,7 @@ func (r *Repository) UpdateScope(ctx context.Context, scope *Scope, version uint func (r *Repository) LookupScope(ctx context.Context, withPublicId string, _ ...Option) (*Scope, error) { const op = "iam.(Repository).LookupScope" if withPublicId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing public id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } scope := AllocScope() scope.PublicId = withPublicId @@ -426,7 +426,7 @@ func (r *Repository) LookupScope(ctx context.Context, withPublicId string, _ ... if errors.IsNotFoundError(err) { return nil, nil } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", withPublicId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", withPublicId))) } return &scope, nil } @@ -435,10 +435,10 @@ func (r *Repository) LookupScope(ctx context.Context, withPublicId string, _ ... func (r *Repository) DeleteScope(ctx context.Context, withPublicId string, _ ...Option) (int, error) { const op = "iam.(Repository).DeleteScope" if withPublicId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing public id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } if withPublicId == scope.Global.String() { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "invalid to delete global scope") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "invalid to delete global scope") } scope := AllocScope() scope.PublicId = withPublicId @@ -447,7 +447,7 @@ func (r *Repository) DeleteScope(ctx context.Context, withPublicId string, _ ... if errors.Is(err, ErrMetadataScopeNotFound) { return 0, nil } - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", withPublicId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", withPublicId))) } return rowsDeleted, nil } @@ -456,12 +456,12 @@ func (r *Repository) DeleteScope(ctx context.Context, withPublicId string, _ ... func (r *Repository) ListScopes(ctx context.Context, withParentIds []string, opt ...Option) ([]*Scope, error) { const op = "iam.(Repository).ListScopes" if len(withParentIds) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing parent id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing parent id") } var items []*Scope err := r.list(ctx, &items, "parent_id in (?)", []interface{}{withParentIds}, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return items, nil } @@ -487,11 +487,11 @@ func (r *Repository) ListScopesRecursively(ctx context.Context, rootScopeId stri args = append(args, rootScopeId) default: // We have no idea what scope type this is so bail - return nil, errors.New(errors.InvalidPublicId, op+":TypeSwitch", "invalid scope ID") + return nil, errors.New(ctx, errors.InvalidPublicId, op+":TypeSwitch", "invalid scope ID") } err := r.list(ctx, &scopes, where, args, opt...) if err != nil { - return nil, errors.Wrap(err, op+":ListQuery") + return nil, errors.Wrap(ctx, err, op+":ListQuery") } return scopes, nil } diff --git a/internal/iam/repository_user.go b/internal/iam/repository_user.go index 08562751b..6ed4dc2ef 100644 --- a/internal/iam/repository_user.go +++ b/internal/iam/repository_user.go @@ -17,10 +17,10 @@ import ( func (r *Repository) CreateUser(ctx context.Context, user *User, opt ...Option) (*User, error) { const op = "iam.(Repository).CreateUser" if user == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing user") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing user") } if user.PublicId != "" { - return nil, errors.New(errors.InvalidParameter, op, "public id is not empty") + return nil, errors.New(ctx, errors.InvalidParameter, op, "public id is not empty") } u := user.Clone().(*User) @@ -28,13 +28,13 @@ func (r *Repository) CreateUser(ctx context.Context, user *User, opt ...Option) if opts.withPublicId != "" { if !strings.HasPrefix(opts.withPublicId, UserPrefix+"_") { - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("passed-in public ID %q has wrong prefix, should be %q", opts.withPublicId, UserPrefix)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("passed-in public ID %q has wrong prefix, should be %q", opts.withPublicId, UserPrefix)) } u.PublicId = opts.withPublicId } else { id, err := newUserId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } u.PublicId = id } @@ -52,9 +52,9 @@ func (r *Repository) CreateUser(ctx context.Context, user *User, opt ...Option) resource, err := r.create(ctx, u) if err != nil { if errors.IsUniqueError(err) { - return nil, errors.New(errors.NotUnique, op, fmt.Sprintf("user %s already exists in org %s", user.Name, user.ScopeId)) + return nil, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("user %s already exists in org %s", user.Name, user.ScopeId)) } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("for %s", u.PublicId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("for %s", u.PublicId))) } return resource.(*User), nil } @@ -68,17 +68,17 @@ func (r *Repository) CreateUser(ctx context.Context, user *User, opt ...Option) func (r *Repository) UpdateUser(ctx context.Context, user *User, version uint32, fieldMaskPaths []string, opt ...Option) (*User, []string, int, error) { const op = "iam.(Repository).UpdateUser" if user == nil { - return nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing user") + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing user") } if user.PublicId == "" { - return nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing public id") + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } for _, f := range fieldMaskPaths { switch { case strings.EqualFold("name", f): case strings.EqualFold("description", f): default: - return nil, nil, db.NoRowsAffected, errors.New(errors.InvalidFieldMask, op, fmt.Sprintf("invalid field mask: %s", f)) + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidFieldMask, op, fmt.Sprintf("invalid field mask: %s", f)) } } var dbMask, nullFields []string @@ -91,13 +91,13 @@ func (r *Repository) UpdateUser(ctx context.Context, user *User, version uint32, nil, ) if len(dbMask) == 0 && len(nullFields) == 0 { - return nil, nil, db.NoRowsAffected, errors.E(errors.WithCode(errors.EmptyFieldMask), errors.WithOp(op)) + return nil, nil, db.NoRowsAffected, errors.E(ctx, errors.WithCode(errors.EmptyFieldMask), errors.WithOp(op)) } u := user.Clone().(*User) metadata, err := r.stdMetadata(ctx, u) if err != nil { - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } metadata["op-type"] = []string{oplog.OpType_OP_TYPE_UPDATE.String()} @@ -111,12 +111,12 @@ func (r *Repository) UpdateUser(ctx context.Context, user *User, version uint32, scope, err := u.GetScope(ctx, r.reader) if err != nil { - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get scope")) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get scope")) } oplogWrapper, err := r.kms.GetWrapper(ctx, scope.GetPublicId(), kms.KeyPurposeOplog) if err != nil { - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } dbOpts = append(dbOpts, db.WithOplog(oplogWrapper, metadata)) @@ -137,11 +137,11 @@ func (r *Repository) UpdateUser(ctx context.Context, user *User, version uint32, dbOpts..., ) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsUpdated > 1 { // return err, which will result in a rollback of the update - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been updated") } txRepo := &Repository{ reader: reader, @@ -151,20 +151,20 @@ func (r *Repository) UpdateUser(ctx context.Context, user *User, version uint32, } returnedUser, err = txRepo.lookupUser(ctx, user.PublicId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current user after update")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current user after update")) } currentAccountIds, err = txRepo.ListUserAccounts(ctx, user.PublicId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current account ids after update")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current account ids after update")) } return nil }, ) if err != nil { if errors.IsUniqueError(err) { - return nil, nil, db.NoRowsAffected, errors.New(errors.NotUnique, op, fmt.Sprintf("user %s already exists in org %s", user.Name, user.ScopeId)) + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("user %s already exists in org %s", user.Name, user.ScopeId)) } - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("for %s", user.PublicId))) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("for %s", user.PublicId))) } return returnedUser, currentAccountIds, rowsUpdated, nil } @@ -174,15 +174,15 @@ func (r *Repository) UpdateUser(ctx context.Context, user *User, version uint32, func (r *Repository) LookupUser(ctx context.Context, userId string, _ ...Option) (*User, []string, error) { const op = "iam.(Repository).LookupUser" if userId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing public id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } user, err := r.lookupUser(ctx, userId) if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } currentAccountIds, err := r.ListUserAccounts(ctx, userId) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to retrieve current account ids")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current account ids")) } return user, currentAccountIds, nil } @@ -191,16 +191,16 @@ func (r *Repository) LookupUser(ctx context.Context, userId string, _ ...Option) func (r *Repository) DeleteUser(ctx context.Context, withPublicId string, _ ...Option) (int, error) { const op = "iam.(Repository).DeleteUser" if withPublicId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing public id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } user := AllocUser() user.PublicId = withPublicId if err := r.reader.LookupByPublicId(ctx, &user); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("for %s", withPublicId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("for %s", withPublicId))) } rowsDeleted, err := r.delete(ctx, &user) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("for %s", withPublicId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("for %s", withPublicId))) } return rowsDeleted, nil } @@ -209,11 +209,11 @@ func (r *Repository) DeleteUser(ctx context.Context, withPublicId string, _ ...O func (r *Repository) ListUsers(ctx context.Context, withScopeIds []string, opt ...Option) ([]*User, error) { const op = "iam.(Repository).ListUsers" if len(withScopeIds) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } users, err := r.getUsers(ctx, "", withScopeIds, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return users, nil } @@ -228,11 +228,11 @@ func (r *Repository) ListUsers(ctx context.Context, withScopeIds []string, opt . func (r *Repository) LookupUserWithLogin(ctx context.Context, accountId string, opt ...Option) (*User, error) { const op = "iam.(Repository).LookupUserWithLogin" if accountId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing account id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing account id") } u, err := r.getUserWithAccount(ctx, accountId) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if u != nil { return u, nil @@ -242,15 +242,15 @@ func (r *Repository) LookupUserWithLogin(ctx context.Context, accountId string, acct.PublicId = accountId err = r.reader.LookupByPublicId(context.Background(), &acct) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to lookup account %s", accountId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to lookup account %s", accountId))) } allowed, err := r.allowUserAutoVivify(ctx, &acct) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if !allowed { - return nil, errors.New(errors.RecordNotFound, op, fmt.Sprintf("user not found for account %s and auth method is not primary for the scope so refusing to auto-create user", accountId)) + return nil, errors.New(ctx, errors.RecordNotFound, op, fmt.Sprintf("user not found for account %s and auth method is not primary for the scope so refusing to auto-create user", accountId)) } metadata := oplog.Metadata{ @@ -262,7 +262,7 @@ func (r *Repository) LookupUserWithLogin(ctx context.Context, accountId string, oplogWrapper, err := r.kms.GetWrapper(ctx, acct.GetScopeId(), kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } // We will create a new user and associate the user with the account @@ -276,21 +276,21 @@ func (r *Repository) LookupUserWithLogin(ctx context.Context, accountId string, msgs := make([]*oplog.Message, 0, 2) ticket, err := w.GetTicket(&acct) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } obtainedUser, err = NewUser(acct.ScopeId, opt...) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } id, err := newUserId() if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } var createMsg oplog.Message obtainedUser.PublicId = id err = w.Create(ctx, obtainedUser, db.NewOplogMsg(&createMsg)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } msgs = append(msgs, &createMsg) @@ -299,14 +299,14 @@ func (r *Repository) LookupUserWithLogin(ctx context.Context, accountId string, updateAcct.IamUserId = id updatedRows, err := w.Update(ctx, updateAcct, []string{"IamUserId"}, nil, db.NewOplogMsg(&updateMsg)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if updatedRows != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("account update affected %d rows", updatedRows)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("account update affected %d rows", updatedRows)) } msgs = append(msgs, &updateMsg) if err := w.WriteOplogEntryWith(ctx, oplogWrapper, ticket, metadata, msgs); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } txRepo := &Repository{ reader: reader, @@ -316,13 +316,13 @@ func (r *Repository) LookupUserWithLogin(ctx context.Context, accountId string, } obtainedUser, err = txRepo.lookupUser(ctx, obtainedUser.PublicId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve user")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve user")) } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return obtainedUser, nil } @@ -331,13 +331,13 @@ func (r *Repository) LookupUserWithLogin(ctx context.Context, accountId string, func (r *Repository) allowUserAutoVivify(ctx context.Context, acct *authAccount) (bool, error) { const op = "iam.(Repository).allowUserAutoVivify" if acct == nil { - return false, errors.New(errors.InvalidParameter, op, "missing account") + return false, errors.New(ctx, errors.InvalidParameter, op, "missing account") } acctScope := AllocScope() acctScope.PublicId = acct.ScopeId err := r.reader.LookupByPublicId(context.Background(), &acctScope) if err != nil { - return false, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to lookup account's scope %s", acct.ScopeId))) + return false, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to lookup account's scope %s", acct.ScopeId))) } return acct.AuthMethodId == acctScope.PrimaryAuthMethodId, nil } @@ -345,22 +345,22 @@ func (r *Repository) allowUserAutoVivify(ctx context.Context, acct *authAccount) func (r *Repository) getUserWithAccount(ctx context.Context, withAccountId string, _ ...Option) (*User, error) { const op = "iam.(Repository).getUserWithAccount" if withAccountId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing account id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing account id") } rows, err := r.reader.Query(ctx, whereUserAccount, []interface{}{withAccountId}) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to query account %s", withAccountId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to query account %s", withAccountId))) } defer rows.Close() u := AllocUser() if rows.Next() { err = r.reader.ScanRows(rows, &u) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to scan rows for account %s", withAccountId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to scan rows for account %s", withAccountId))) } } else { if err := rows.Err(); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get next account")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get next account")) } return nil, nil } @@ -372,11 +372,11 @@ func (r *Repository) getUserWithAccount(ctx context.Context, withAccountId strin func (r *Repository) ListUserAccounts(ctx context.Context, userId string, opt ...Option) ([]string, error) { const op = "iam.(Repository).ListUserAccounts" if userId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing user id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing user id") } var accounts []*authAccount if err := r.list(ctx, &accounts, "iam_user_id = ?", []interface{}{userId}, opt...); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if len(accounts) == 0 { return nil, nil @@ -395,22 +395,22 @@ func (r *Repository) ListUserAccounts(ctx context.Context, userId string, opt .. func (r *Repository) AddUserAccounts(ctx context.Context, userId string, userVersion uint32, accountIds []string, _ ...Option) ([]string, error) { const op = "iam.(Repository).AddUserAccounts" if userId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing user id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing user id") } if userVersion == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing user version") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing user version") } if len(accountIds) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing account ids") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing account ids") } user, err := r.lookupUser(ctx, userId) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to lookup user %s", userId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to lookup user %s", userId))) } oplogWrapper, err := r.kms.GetWrapper(ctx, user.ScopeId, kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var currentAccountIds []string @@ -421,7 +421,7 @@ func (r *Repository) AddUserAccounts(ctx context.Context, userId string, userVer func(reader db.Reader, w db.Writer) error { userTicket, err := w.GetTicket(user) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } updatedUser := AllocUser() updatedUser.PublicId = userId @@ -429,13 +429,13 @@ func (r *Repository) AddUserAccounts(ctx context.Context, userId string, userVer var userOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, &updatedUser, []string{"Version"}, nil, db.NewOplogMsg(&userOplogMsg), db.WithVersion(&userVersion)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get user version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get user version")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated user and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated user and %d rows updated", rowsUpdated)) } if err := associateUserWithAccounts(ctx, r.kms, reader, w, user.PublicId, accountIds); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } metadata := oplog.Metadata{ "op-type": []string{oplog.OpType_OP_TYPE_UPDATE.String()}, @@ -444,7 +444,7 @@ func (r *Repository) AddUserAccounts(ctx context.Context, userId string, userVer "resource-public-id": []string{user.PublicId}, } if err := w.WriteOplogEntryWith(ctx, oplogWrapper, userTicket, metadata, []*oplog.Message{&userOplogMsg}); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } // we need a new repo, that's using the same reader/writer as this TxHandler txRepo := &Repository{ @@ -456,13 +456,13 @@ func (r *Repository) AddUserAccounts(ctx context.Context, userId string, userVer } currentAccountIds, err = txRepo.ListUserAccounts(ctx, user.PublicId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current account ids after adds")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current account ids after adds")) } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return currentAccountIds, nil } @@ -474,22 +474,22 @@ func (r *Repository) AddUserAccounts(ctx context.Context, userId string, userVer func (r *Repository) DeleteUserAccounts(ctx context.Context, userId string, userVersion uint32, accountIds []string, _ ...Option) ([]string, error) { const op = "iam.(Repository).DeleteUserAccounts" if userId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing public id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } if userVersion == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing user version") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing user version") } if len(accountIds) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing account ids") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing account ids") } user, err := r.lookupUser(ctx, userId) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to lookup user %s", userId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to lookup user %s", userId))) } oplogWrapper, err := r.kms.GetWrapper(ctx, user.ScopeId, kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var currentAccountIds []string @@ -500,7 +500,7 @@ func (r *Repository) DeleteUserAccounts(ctx context.Context, userId string, user func(reader db.Reader, w db.Writer) error { userTicket, err := w.GetTicket(user) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } updatedUser := AllocUser() updatedUser.PublicId = userId @@ -508,13 +508,13 @@ func (r *Repository) DeleteUserAccounts(ctx context.Context, userId string, user var userOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, &updatedUser, []string{"Version"}, nil, db.NewOplogMsg(&userOplogMsg), db.WithVersion(&userVersion)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update user version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update user version")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated user and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated user and %d rows updated", rowsUpdated)) } if err := dissociateUserFromAccounts(ctx, r.kms, reader, w, user.PublicId, accountIds); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } metadata := oplog.Metadata{ "op-type": []string{oplog.OpType_OP_TYPE_UPDATE.String()}, @@ -523,7 +523,7 @@ func (r *Repository) DeleteUserAccounts(ctx context.Context, userId string, user "resource-public-id": []string{user.PublicId}, } if err := w.WriteOplogEntryWith(ctx, oplogWrapper, userTicket, metadata, []*oplog.Message{&userOplogMsg}); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } // we need a new repo, that's using the same reader/writer as this TxHandler txRepo := &Repository{ @@ -535,13 +535,13 @@ func (r *Repository) DeleteUserAccounts(ctx context.Context, userId string, user } currentAccountIds, err = txRepo.ListUserAccounts(ctx, user.PublicId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current account ids after adds")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current account ids after adds")) } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return currentAccountIds, nil } @@ -553,19 +553,19 @@ func (r *Repository) DeleteUserAccounts(ctx context.Context, userId string, user func (r *Repository) SetUserAccounts(ctx context.Context, userId string, userVersion uint32, accountIds []string, _ ...Option) ([]string, error) { const op = "iam.(Repository).SetUserAccounts" if userId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing public id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } if userVersion == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing version") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing version") } user, err := r.lookupUser(ctx, userId) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to lookup user %s", userId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to lookup user %s", userId))) } oplogWrapper, err := r.kms.GetWrapper(ctx, user.ScopeId, kms.KeyPurposeOplog) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var currentAccountIds []string _, err = r.writer.DoTx( @@ -575,7 +575,7 @@ func (r *Repository) SetUserAccounts(ctx context.Context, userId string, userVer func(reader db.Reader, w db.Writer) error { associateIds, disassociateIds, err := associationChanges(ctx, reader, userId, accountIds) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to determine changes")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to determine changes")) } // just in case we've got nothing to do... @@ -590,13 +590,13 @@ func (r *Repository) SetUserAccounts(ctx context.Context, userId string, userVer } currentAccountIds, err = txRepo.ListUserAccounts(ctx, userId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current account ids after set")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current account ids after set")) } return nil } userTicket, err := w.GetTicket(user) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } updatedUser := AllocUser() updatedUser.PublicId = userId @@ -604,21 +604,21 @@ func (r *Repository) SetUserAccounts(ctx context.Context, userId string, userVer var userOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, &updatedUser, []string{"Version"}, nil, db.NewOplogMsg(&userOplogMsg), db.WithVersion(&userVersion)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update user version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update user version")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated user and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated user and %d rows updated", rowsUpdated)) } if len(associateIds) > 0 { if err := associateUserWithAccounts(ctx, r.kms, reader, w, userId, associateIds); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to associate ids")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to associate ids")) } } if len(disassociateIds) > 0 { if err := dissociateUserFromAccounts(ctx, r.kms, reader, w, userId, disassociateIds); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to disassociate ids")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to disassociate ids")) } } @@ -629,7 +629,7 @@ func (r *Repository) SetUserAccounts(ctx context.Context, userId string, userVer "resource-public-id": []string{userId}, } if err := w.WriteOplogEntryWith(ctx, oplogWrapper, userTicket, metadata, []*oplog.Message{&userOplogMsg}); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } // we need a new repo, that's using the same reader/writer as this TxHandler txRepo := &Repository{ @@ -641,13 +641,13 @@ func (r *Repository) SetUserAccounts(ctx context.Context, userId string, userVer } currentAccountIds, err = txRepo.ListUserAccounts(ctx, user.PublicId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current account ids after set")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current account ids after set")) } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return currentAccountIds, nil } @@ -657,19 +657,19 @@ func (r *Repository) SetUserAccounts(ctx context.Context, userId string, userVer func associateUserWithAccounts(ctx context.Context, repoKms *kms.Kms, reader db.Reader, writer db.Writer, userId string, accountIds []string, _ ...Option) error { const op = "iam.associateUserWithAccounts" if repoKms == nil { - return errors.New(errors.InvalidParameter, op, "nil kms") + return errors.New(ctx, errors.InvalidParameter, op, "nil kms") } if reader == nil { - return errors.New(errors.InvalidParameter, op, "nil reader") + return errors.New(ctx, errors.InvalidParameter, op, "nil reader") } if writer == nil { - return errors.New(errors.InvalidParameter, op, "nil writer") + return errors.New(ctx, errors.InvalidParameter, op, "nil writer") } if userId == "" { - return errors.New(errors.InvalidParameter, op, "missing user id") + return errors.New(ctx, errors.InvalidParameter, op, "missing user id") } if len(accountIds) == 0 { - return errors.New(errors.InvalidParameter, op, "missing account ids") + return errors.New(ctx, errors.InvalidParameter, op, "missing account ids") } authAccounts := make([]*authAccount, 0, len(accountIds)) for _, accountId := range accountIds { @@ -677,10 +677,10 @@ func associateUserWithAccounts(ctx context.Context, repoKms *kms.Kms, reader db. acct.PublicId = accountId err := reader.LookupByPublicId(ctx, &acct) if err != nil { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to lookup account %s", accountId))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to lookup account %s", accountId))) } if acct.IamUserId != "" && acct.IamUserId != userId { - return errors.New(errors.AccountAlreadyAssociated, op, fmt.Sprintf("%s account is already associated with another user", accountId)) + return errors.New(ctx, errors.AccountAlreadyAssociated, op, fmt.Sprintf("%s account is already associated with another user", accountId)) } authAccounts = append(authAccounts, &acct) } @@ -689,7 +689,7 @@ func associateUserWithAccounts(ctx context.Context, repoKms *kms.Kms, reader db. // wrapper could be different for each authAccount depending on it's scope oplogWrapper, err := repoKms.GetWrapper(ctx, aa.GetScopeId(), kms.KeyPurposeOplog) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } metadata := oplog.Metadata{ @@ -703,13 +703,13 @@ func associateUserWithAccounts(ctx context.Context, repoKms *kms.Kms, reader db. updatedAcct.IamUserId = userId updatedRows, err = writer.Update(ctx, updatedAcct, []string{"IamUserId"}, nil, db.WithOplog(oplogWrapper, metadata), db.WithWhere("iam_user_id is NULL or iam_user_id = ?", userId)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed to associate %s account", aa.PublicId))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed to associate %s account", aa.PublicId))) } if updatedRows == 0 { - return errors.New(errors.AccountAlreadyAssociated, op, fmt.Sprintf("failed to associate %s account: it is already associated with another user", aa.PublicId)) + return errors.New(ctx, errors.AccountAlreadyAssociated, op, fmt.Sprintf("failed to associate %s account: it is already associated with another user", aa.PublicId)) } if updatedRows > 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("failed to associate %s account: would have updated too many accounts %d", aa.PublicId, updatedRows)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("failed to associate %s account: would have updated too many accounts %d", aa.PublicId, updatedRows)) } } return nil @@ -721,19 +721,19 @@ func associateUserWithAccounts(ctx context.Context, repoKms *kms.Kms, reader db. func dissociateUserFromAccounts(ctx context.Context, repoKms *kms.Kms, reader db.Reader, writer db.Writer, userId string, accountIds []string, _ ...Option) error { const op = "iam.dissociateUserFromAccounts" if repoKms == nil { - return errors.New(errors.InvalidParameter, op, "nil kms") + return errors.New(ctx, errors.InvalidParameter, op, "nil kms") } if reader == nil { - return errors.New(errors.InvalidParameter, op, "nil reader") + return errors.New(ctx, errors.InvalidParameter, op, "nil reader") } if writer == nil { - return errors.New(errors.InvalidParameter, op, "nil writer") + return errors.New(ctx, errors.InvalidParameter, op, "nil writer") } if userId == "" { - return errors.New(errors.InvalidParameter, op, "missing public id") + return errors.New(ctx, errors.InvalidParameter, op, "missing public id") } if len(accountIds) == 0 { - return errors.New(errors.InvalidParameter, op, "missing account ids") + return errors.New(ctx, errors.InvalidParameter, op, "missing account ids") } authAccounts := make([]*authAccount, 0, len(accountIds)) for _, accountId := range accountIds { @@ -741,10 +741,10 @@ func dissociateUserFromAccounts(ctx context.Context, repoKms *kms.Kms, reader db acct.PublicId = accountId err := reader.LookupByPublicId(context.Background(), &acct) if err != nil { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to lookup account %s", accountId))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to lookup account %s", accountId))) } if acct.IamUserId != userId { - return errors.New(errors.AccountAlreadyAssociated, op, fmt.Sprintf("%s account is not associated with user %s", accountId, userId)) + return errors.New(ctx, errors.AccountAlreadyAssociated, op, fmt.Sprintf("%s account is not associated with user %s", accountId, userId)) } authAccounts = append(authAccounts, &acct) } @@ -753,7 +753,7 @@ func dissociateUserFromAccounts(ctx context.Context, repoKms *kms.Kms, reader db // wrapper could be different for each authAccount depending on it's scope oplogWrapper, err := repoKms.GetWrapper(ctx, aa.GetScopeId(), kms.KeyPurposeOplog) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } metadata := oplog.Metadata{ "resource-public-id": []string{aa.PublicId}, @@ -767,13 +767,13 @@ func dissociateUserFromAccounts(ctx context.Context, repoKms *kms.Kms, reader db // update IamUserId to null updatedRows, err = writer.Update(ctx, updatedAcct, nil, []string{"IamUserId"}, db.WithOplog(oplogWrapper, metadata), db.WithWhere("iam_user_id is NULL or iam_user_id = ?", userId)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed to disassociate %s account", aa.PublicId))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed to disassociate %s account", aa.PublicId))) } if updatedRows == 0 { - return errors.New(errors.AccountAlreadyAssociated, op, fmt.Sprintf("failed to disassociate %s account: it is already associated with another user", aa.PublicId)) + return errors.New(ctx, errors.AccountAlreadyAssociated, op, fmt.Sprintf("failed to disassociate %s account: it is already associated with another user", aa.PublicId)) } if updatedRows > 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("failed to disassociate %s account: would have updated too many accounts %d", aa.PublicId, updatedRows)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("failed to disassociate %s account: would have updated too many accounts %d", aa.PublicId, updatedRows)) } } return nil @@ -800,7 +800,7 @@ func associationChanges(ctx context.Context, reader db.Reader, userId string, ac } rows, err := reader.Query(ctx, query, params) if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } defer rows.Close() @@ -812,14 +812,14 @@ func associationChanges(ctx context.Context, reader db.Reader, userId string, ac for rows.Next() { var chg change if err := reader.ScanRows(rows, &chg); err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } changes = append(changes, &chg) } var associateIds, disassociateIds []string for _, c := range changes { if c.AccountId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing account id in change result") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing account id in change result") } switch c.Action { case "associate": @@ -827,7 +827,7 @@ func associationChanges(ctx context.Context, reader db.Reader, userId string, ac case "disassociate": disassociateIds = append(disassociateIds, c.AccountId) default: - return nil, nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("unknown action %s for %s", c.Action, c.AccountId)) + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("unknown action %s for %s", c.Action, c.AccountId)) } } return associateIds, disassociateIds, nil @@ -838,13 +838,13 @@ func (r *Repository) lookupUser(ctx context.Context, userId string, opt ...Optio const op = "iam.(Repository).lookupUser" users, err := r.getUsers(ctx, userId, nil, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } switch { case len(users) == 0: return nil, nil // not an error to return no rows for a lookup case len(users) > 1: - return nil, errors.New(errors.NotSpecificIntegrity, op, fmt.Sprintf("%s matched more than 1 ", userId)) + return nil, errors.New(ctx, errors.NotSpecificIntegrity, op, fmt.Sprintf("%s matched more than 1 ", userId)) default: return users[0], nil } @@ -859,10 +859,10 @@ func (r *Repository) lookupUser(ctx context.Context, userId string, opt ...Optio func (r *Repository) getUsers(ctx context.Context, userId string, scopeIds []string, opt ...Option) ([]*User, error) { const op = "iam.(Repository).getUsers" if userId == "" && len(scopeIds) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing search criteria: both user id and scope ids are empty") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing search criteria: both user id and scope ids are empty") } if userId != "" && len(scopeIds) > 0 { - return nil, errors.New(errors.InvalidParameter, op, "searching for both a specific user id and scope ids is not supported") + return nil, errors.New(ctx, errors.InvalidParameter, op, "searching for both a specific user id and scope ids is not supported") } opts := getOpts(opt...) @@ -885,7 +885,7 @@ func (r *Repository) getUsers(ctx context.Context, userId string, scopeIds []str var usersAcctInfo []*userAccountInfo err := r.reader.SearchWhere(ctx, &usersAcctInfo, strings.Join(where, " and "), args, dbArgs...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if len(usersAcctInfo) == 0 { // we're done if nothing is found. return nil, nil diff --git a/internal/iam/resource.go b/internal/iam/resource.go index 9401557b2..d110af7f4 100644 --- a/internal/iam/resource.go +++ b/internal/iam/resource.go @@ -50,27 +50,27 @@ type ResourceWithScope interface { func LookupScope(ctx context.Context, reader db.Reader, resource ResourceWithScope) (*Scope, error) { const op = "iam.LookupScope" if reader == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil reader") + return nil, errors.New(ctx, errors.InvalidParameter, op, "nil reader") } if resource == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing resource") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing resource") } if resource.GetPublicId() == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing public id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } if resource.GetScopeId() == "" { // try to retrieve it from db with it's scope id if err := reader.LookupById(ctx, resource); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } // if it's still not set after getting it from the db... if resource.GetScopeId() == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } } var p Scope if err := reader.LookupWhere(ctx, &p, "public_id = ?", resource.GetScopeId()); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return &p, nil } @@ -82,14 +82,14 @@ func validateScopeForWrite(ctx context.Context, r db.Reader, resource ResourceWi if opType == db.CreateOp { if resource.GetScopeId() == "" { - return errors.New(errors.InvalidParameter, op, "error scope id not set for user write") + return errors.New(ctx, errors.InvalidParameter, op, "error scope id not set for user write") } ps, err := LookupScope(ctx, r, resource) if err != nil { if errors.IsNotFoundError(err) { - return errors.New(errors.RecordNotFound, op, "scope is not found") + return errors.New(ctx, errors.RecordNotFound, op, "scope is not found") } - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } validScopeType := false for _, t := range resource.validScopeTypes() { @@ -98,13 +98,13 @@ func validateScopeForWrite(ctx context.Context, r db.Reader, resource ResourceWi } } if !validScopeType { - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("%s not a valid scope type for this resource", ps.Type)) + return errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s not a valid scope type for this resource", ps.Type)) } } if opType == db.UpdateOp && resource.GetScopeId() != "" { if contains(opts.WithFieldMaskPaths, "ScopeId") || contains(opts.WithNullPaths, "ScopeId") { - return errors.New(errors.InvalidParameter, op, "not allowed to change a resource's scope") + return errors.New(ctx, errors.InvalidParameter, op, "not allowed to change a resource's scope") } } return nil diff --git a/internal/iam/role.go b/internal/iam/role.go index 67559d19c..49561f441 100644 --- a/internal/iam/role.go +++ b/internal/iam/role.go @@ -34,7 +34,7 @@ var ( func NewRole(scopeId string, opt ...Option) (*Role, error) { const op = "iam.NewRole" if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing scope id") } opts := getOpts(opt...) r := &Role{ @@ -66,10 +66,10 @@ func (r *Role) Clone() interface{} { func (role *Role) VetForWrite(ctx context.Context, r db.Reader, opType db.OpType, opt ...db.Option) error { const op = "iam.(Role).VetForWrite" if role.PublicId == "" { - return errors.New(errors.InvalidParameter, op, "missing public id") + return errors.New(ctx, errors.InvalidParameter, op, "missing public id") } if err := validateScopeForWrite(ctx, r, role, opType, opt...); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } diff --git a/internal/iam/role_grant.go b/internal/iam/role_grant.go index 012555db4..196401067 100644 --- a/internal/iam/role_grant.go +++ b/internal/iam/role_grant.go @@ -28,10 +28,10 @@ var ( func NewRoleGrant(roleId string, grant string, _ ...Option) (*RoleGrant, error) { const op = "iam.NewRoleGrant" if roleId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing role id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing role id") } if grant == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing grant") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing grant") } // Validate that the grant parses successfully. Note that we fake the scope @@ -39,7 +39,7 @@ func NewRoleGrant(roleId string, grant string, _ ...Option) (*RoleGrant, error) // checking time and we just care that it parses correctly. perm, err := perms.Parse("o_abcd1234", grant) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("parsing grant string")) + return nil, errors.WrapDeprecated(err, op, errors.WithMsg("parsing grant string")) } rg := &RoleGrant{ RoleGrant: &store.RoleGrant{ @@ -66,10 +66,10 @@ func (g *RoleGrant) Clone() interface{} { } // VetForWrite implements db.VetForWrite() interface -func (g *RoleGrant) VetForWrite(_ context.Context, _ db.Reader, _ db.OpType, _ ...db.Option) error { +func (g *RoleGrant) VetForWrite(ctx context.Context, _ db.Reader, _ db.OpType, _ ...db.Option) error { const op = "iam.(RoleGrant).VetForWrite" if g.RawGrant == "" { - return errors.New(errors.InvalidParameter, op, "missing grant") + return errors.New(ctx, errors.InvalidParameter, op, "missing grant") } // Validate that the grant parses successfully. Note that we fake the scope @@ -79,11 +79,11 @@ func (g *RoleGrant) VetForWrite(_ context.Context, _ db.Reader, _ db.OpType, _ . // anyways because it should still be part of the vetting process. perm, err := perms.Parse("o_abcd1234", g.RawGrant) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("parsing grant string")) + return errors.Wrap(ctx, err, op, errors.WithMsg("parsing grant string")) } canonical := perm.CanonicalString() if g.CanonicalGrant != "" && g.CanonicalGrant != canonical { - return errors.Wrap(err, op, errors.WithMsg("existing canonical grant and derived one do not match")) + return errors.Wrap(ctx, err, op, errors.WithMsg("existing canonical grant and derived one do not match")) } g.CanonicalGrant = canonical diff --git a/internal/iam/scope.go b/internal/iam/scope.go index 6fde2fc83..513dc16a4 100644 --- a/internal/iam/scope.go +++ b/internal/iam/scope.go @@ -46,7 +46,7 @@ func NewProject(orgPublicId string, opt ...Option) (*Scope, error) { org.PublicId = orgPublicId p, err := newScope(&org, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.WrapDeprecated(err, op) } return p, nil } @@ -59,7 +59,7 @@ func NewProject(orgPublicId string, opt ...Option) (*Scope, error) { func newScope(parent *Scope, opt ...Option) (*Scope, error) { const op = "iam.newScope" if parent == nil || parent.PublicId == "" { - return nil, errors.New(errors.InvalidParameter, op, "child scope is missing its parent") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "child scope is missing its parent") } var typ scope.Type switch { @@ -69,7 +69,7 @@ func newScope(parent *Scope, opt ...Option) (*Scope, error) { typ = scope.Project } if typ == scope.Unknown { - return nil, errors.New(errors.InvalidParameter, op, "unknown scope type") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "unknown scope type") } opts := getOpts(opt...) @@ -106,40 +106,40 @@ func (s *Scope) Clone() interface{} { func (s *Scope) VetForWrite(ctx context.Context, r db.Reader, opType db.OpType, opt ...db.Option) error { const op = "iam.(Scope).VetForWrite" if s.Type == scope.Unknown.String() { - return errors.New(errors.InvalidParameter, op, "unknown scope type") + return errors.New(ctx, errors.InvalidParameter, op, "unknown scope type") } if s.PublicId == "" { - return errors.New(errors.InvalidParameter, op, "missing public id") + return errors.New(ctx, errors.InvalidParameter, op, "missing public id") } if opType == db.UpdateOp { dbOptions := db.GetOpts(opt...) for _, path := range dbOptions.WithFieldMaskPaths { switch path { case "ParentId": - return errors.New(errors.InvalidParameter, op, "you cannot change a scope's parent") + return errors.New(ctx, errors.InvalidParameter, op, "you cannot change a scope's parent") case "Type": - return errors.New(errors.InvalidParameter, op, "you cannot change a scope's type") + return errors.New(ctx, errors.InvalidParameter, op, "you cannot change a scope's type") } } } if opType == db.CreateOp { switch { case s.Type == scope.Global.String(): - return errors.New(errors.InvalidParameter, op, "you cannot create a global scope") + return errors.New(ctx, errors.InvalidParameter, op, "you cannot create a global scope") case s.ParentId == "": - return errors.New(errors.InvalidParameter, op, "scope must have a parent") + return errors.New(ctx, errors.InvalidParameter, op, "scope must have a parent") case s.Type == scope.Org.String(): if s.ParentId != "global" { - return errors.New(errors.InvalidParameter, op, `org's parent must be "global"`) + return errors.New(ctx, errors.InvalidParameter, op, `org's parent must be "global"`) } case s.Type == scope.Project.String(): parentScope := AllocScope() parentScope.PublicId = s.ParentId if err := r.LookupByPublicId(ctx, &parentScope, opt...); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to verify project's org scope")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to verify project's org scope")) } if parentScope.Type != scope.Org.String() { - return errors.New(errors.InvalidParameter, op, "project parent scope is not an org") + return errors.New(ctx, errors.InvalidParameter, op, "project parent scope is not an org") } } } @@ -160,14 +160,14 @@ func (*Scope) Actions() map[string]action.Type { func (s *Scope) GetScope(ctx context.Context, r db.Reader) (*Scope, error) { const op = "iam.(Scope).GetScope" if r == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil reader") + return nil, errors.New(ctx, errors.InvalidParameter, op, "nil reader") } if s.PublicId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing public id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } if s.Type == "" && s.ParentId == "" { if err := r.LookupByPublicId(ctx, s); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } } // HANDLE_GLOBAL @@ -185,11 +185,11 @@ func (s *Scope) GetScope(ctx context.Context, r db.Reader) (*Scope, error) { // handled at HANDLE_GLOBAL where := "public_id in (select parent_id from iam_scope where public_id = ?)" if err := r.LookupWhere(ctx, &p, where, s.PublicId); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to lookup parent public id from public id")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to lookup parent public id from public id")) } default: if err := r.LookupWhere(ctx, &p, "public_id = ?", s.ParentId); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to lookup parent from public id")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to lookup parent from public id")) } } return &p, nil diff --git a/internal/iam/user.go b/internal/iam/user.go index bbf9aa150..5430ff7b9 100644 --- a/internal/iam/user.go +++ b/internal/iam/user.go @@ -37,7 +37,7 @@ func NewUser(scopeId string, opt ...Option) (*User, error) { const op = "iam.NewUser" opts := getOpts(opt...) if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing scope id") } u := &User{ User: &store.User{ @@ -69,10 +69,10 @@ func (u *User) Clone() interface{} { func (u *User) VetForWrite(ctx context.Context, r db.Reader, opType db.OpType, opt ...db.Option) error { const op = "iam.(User).VetForWrite" if u.PublicId == "" { - return errors.New(errors.InvalidParameter, op, "missing public id") + return errors.New(ctx, errors.InvalidParameter, op, "missing public id") } if err := validateScopeForWrite(ctx, r, u, opType, opt...); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } diff --git a/internal/kms/database_key.go b/internal/kms/database_key.go index a81166d6d..ae81f2674 100644 --- a/internal/kms/database_key.go +++ b/internal/kms/database_key.go @@ -23,7 +23,7 @@ type DatabaseKey struct { func NewDatabaseKey(rootKeyId string, _ ...Option) (*DatabaseKey, error) { const op = "kms.NewDatabaseKey" if rootKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing root key id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing root key id") } c := &DatabaseKey{ DatabaseKey: &store.DatabaseKey{ @@ -53,15 +53,15 @@ func (k *DatabaseKey) Clone() interface{} { func (k *DatabaseKey) VetForWrite(ctx context.Context, r db.Reader, opType db.OpType, opt ...db.Option) error { const op = "kms.(DatabaseKey).VetForWrite" if k.PrivateId == "" { - return errors.New(errors.InvalidParameter, op, "missing private id") + return errors.New(ctx, errors.InvalidParameter, op, "missing private id") } switch opType { case db.CreateOp: if k.RootKeyId == "" { - return errors.New(errors.InvalidParameter, op, "missing root key id") + return errors.New(ctx, errors.InvalidParameter, op, "missing root key id") } case db.UpdateOp: - return errors.New(errors.InvalidParameter, op, "key is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "key is immutable") } return nil } diff --git a/internal/kms/database_key_version.go b/internal/kms/database_key_version.go index bbe0a15a0..0116729de 100644 --- a/internal/kms/database_key_version.go +++ b/internal/kms/database_key_version.go @@ -25,13 +25,13 @@ type DatabaseKeyVersion struct { func NewDatabaseKeyVersion(databaseKeyId string, key []byte, rootKeyVersionId string, _ ...Option) (*DatabaseKeyVersion, error) { const op = "kms.NewDatabaseKeyVersion" if databaseKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing database key id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing database key id") } if len(key) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing key") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing key") } if rootKeyVersionId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing root key version id") } k := &DatabaseKeyVersion{ @@ -64,21 +64,21 @@ func (k *DatabaseKeyVersion) Clone() interface{} { func (k *DatabaseKeyVersion) VetForWrite(ctx context.Context, r db.Reader, opType db.OpType, opt ...db.Option) error { const op = "kms.(DatabaseKeyVersion).VetForWrite" if k.PrivateId == "" { - return errors.New(errors.InvalidParameter, op, "missing private id") + return errors.New(ctx, errors.InvalidParameter, op, "missing private id") } switch opType { case db.CreateOp: if k.CtKey == nil { - return errors.New(errors.InvalidParameter, op, "missing key") + return errors.New(ctx, errors.InvalidParameter, op, "missing key") } if k.DatabaseKeyId == "" { - return errors.New(errors.InvalidParameter, op, "missing database key id") + return errors.New(ctx, errors.InvalidParameter, op, "missing database key id") } if k.RootKeyVersionId == "" { - return errors.New(errors.InvalidParameter, op, "missing root key version id") + return errors.New(ctx, errors.InvalidParameter, op, "missing root key version id") } case db.UpdateOp: - return errors.New(errors.InvalidParameter, op, "key is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "key is immutable") } return nil } @@ -104,7 +104,7 @@ func (k *DatabaseKeyVersion) Encrypt(ctx context.Context, cipher wrapping.Wrappe // structwrapping doesn't support embedding, so we'll pass in the // store.DatabaseKeyVersion directly if err := structwrapping.WrapStruct(ctx, cipher, k.DatabaseKeyVersion, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Encrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt)) } return nil } @@ -115,7 +115,7 @@ func (k *DatabaseKeyVersion) Decrypt(ctx context.Context, cipher wrapping.Wrappe // structwrapping doesn't support embedding, so we'll pass in the // store.DatabaseKeyVersion directly if err := structwrapping.UnwrapStruct(ctx, cipher, k.DatabaseKeyVersion, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Decrypt)) } return nil } diff --git a/internal/kms/ids.go b/internal/kms/ids.go index 26c44d22f..b408ca667 100644 --- a/internal/kms/ids.go +++ b/internal/kms/ids.go @@ -24,7 +24,7 @@ func newRootKeyId() (string, error) { const op = "kms.newRootKeyId" id, err := db.NewPublicId(RootKeyPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } @@ -33,7 +33,7 @@ func newRootKeyVersionId() (string, error) { const op = "kms.newRootKeyVersionId" id, err := db.NewPublicId(RootKeyVersionPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } @@ -42,7 +42,7 @@ func newDatabaseKeyId() (string, error) { const op = "kms.newDatabaseKeyId" id, err := db.NewPublicId(DatabaseKeyPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } @@ -51,7 +51,7 @@ func newDatabaseKeyVersionId() (string, error) { const op = "kms.newDatabaseKeyVersionId" id, err := db.NewPublicId(DatabaseKeyVersionPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } @@ -60,7 +60,7 @@ func newOplogKeyId() (string, error) { const op = "kms.newOplogKeyId" id, err := db.NewPublicId(OplogKeyPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } @@ -69,7 +69,7 @@ func newOplogKeyVersionId() (string, error) { const op = "kms.newOplogKeyVersionId" id, err := db.NewPublicId(OplogKeyVersionPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } @@ -78,7 +78,7 @@ func newTokenKeyId() (string, error) { const op = "kms.newTokenKeyId" id, err := db.NewPublicId(TokenKeyPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } @@ -87,7 +87,7 @@ func newTokenKeyVersionId() (string, error) { const op = "kms.newTokenKeyVersionId" id, err := db.NewPublicId(TokenKeyVersionPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } @@ -96,7 +96,7 @@ func newSessionKeyId() (string, error) { const op = "kms.newSessionKeyId" id, err := db.NewPublicId(SessionKeyPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } @@ -105,7 +105,7 @@ func newSessionKeyVersionId() (string, error) { const op = "kms.newSessionKeyVersionId" id, err := db.NewPublicId(SessionKeyVersionPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } @@ -114,7 +114,7 @@ func newOidcKeyId() (string, error) { const op = "kms.newOidcKeyId" id, err := db.NewPublicId(OidcKeyPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } @@ -123,7 +123,7 @@ func newOidcKeyVersionId() (string, error) { const op = "kms.newOidcKeyVersionId" id, err := db.NewPublicId(OidcKeyVersionPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } diff --git a/internal/kms/kms.go b/internal/kms/kms.go index d6bafbe8a..566d5ed30 100644 --- a/internal/kms/kms.go +++ b/internal/kms/kms.go @@ -69,7 +69,7 @@ type Kms struct { func NewKms(repo *Repository, opt ...Option) (*Kms, error) { const op = "kms.NewKms" if repo == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing underlying repo") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing underlying repo") } opts := getOpts(opt...) @@ -113,19 +113,19 @@ func (k *Kms) AddExternalWrappers(opt ...Option) error { if opts.withRootWrapper != nil { ext.root = opts.withRootWrapper if ext.root.KeyID() == "" { - return errors.New(errors.InvalidParameter, op, "root wrapper has no key ID") + return errors.NewDeprecated(errors.InvalidParameter, op, "root wrapper has no key ID") } } if opts.withWorkerAuthWrapper != nil { ext.workerAuth = opts.withWorkerAuthWrapper if ext.workerAuth.KeyID() == "" { - return errors.New(errors.InvalidParameter, op, "worker auth wrapper has no key ID") + return errors.NewDeprecated(errors.InvalidParameter, op, "worker auth wrapper has no key ID") } } if opts.withRecoveryWrapper != nil { ext.recovery = opts.withRecoveryWrapper if ext.recovery.KeyID() == "" { - return errors.New(errors.InvalidParameter, op, "recovery wrapper has no key ID") + return errors.NewDeprecated(errors.InvalidParameter, op, "recovery wrapper has no key ID") } } @@ -156,15 +156,15 @@ func (k *Kms) GetExternalWrappers() *ExternalWrappers { func (k *Kms) GetWrapper(ctx context.Context, scopeId string, purpose KeyPurpose, opt ...Option) (wrapping.Wrapper, error) { const op = "kms.GetWrapper" if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } switch purpose { case KeyPurposeOplog, KeyPurposeDatabase, KeyPurposeTokens, KeyPurposeSessions, KeyPurposeOidc: case KeyPurposeUnknown: - return nil, errors.New(errors.InvalidParameter, op, "missing key purpose") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing key purpose") default: - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("unsupported purpose %q", purpose)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("unsupported purpose %q", purpose)) } opts := getOpts(opt...) @@ -189,15 +189,15 @@ func (k *Kms) GetWrapper(ctx context.Context, scopeId string, purpose KeyPurpose // scope-purpose cache will catch everything in steady-state. rootWrapper, rootKeyId, err := k.loadRoot(ctx, scopeId, opt...) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error loading root key for scope %s", scopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error loading root key for scope %s", scopeId))) } if rootWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("got nil root wrapper for scope %s", scopeId)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("got nil root wrapper for scope %s", scopeId)) } wrapper, err := k.loadDek(ctx, scopeId, purpose, rootWrapper, rootKeyId, opt...) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error loading %s for scope %s", purpose.String(), scopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error loading %s for scope %s", purpose.String(), scopeId))) } k.scopePurposeCache.Store(scopeId+purpose.String(), wrapper) @@ -205,7 +205,7 @@ func (k *Kms) GetWrapper(ctx context.Context, scopeId string, purpose KeyPurpose if keyIdWrapper := wrapper.WrapperForKeyID(opts.withKeyId); keyIdWrapper != nil { return keyIdWrapper, nil } - return nil, errors.New(errors.KeyNotFound, op, "unable to find specified key ID") + return nil, errors.New(ctx, errors.KeyNotFound, op, "unable to find specified key ID") } return wrapper, nil @@ -220,7 +220,7 @@ func (k *Kms) loadRoot(ctx context.Context, scopeId string, opt ...Option) (*mul } rootKeys, err := repo.ListRootKeys(ctx) if err != nil { - return nil, "", errors.Wrap(err, op) + return nil, "", errors.Wrap(ctx, err, op) } var rootKeyId string for _, k := range rootKeys { @@ -230,7 +230,7 @@ func (k *Kms) loadRoot(ctx context.Context, scopeId string, opt ...Option) (*mul } } if rootKeyId == "" { - return nil, "", errors.New(errors.KeyNotFound, op, fmt.Sprintf("missing root key for scope %s", scopeId)) + return nil, "", errors.New(ctx, errors.KeyNotFound, op, fmt.Sprintf("missing root key for scope %s", scopeId)) } // Now: find the external KMS that can be used to decrypt the root values @@ -239,21 +239,21 @@ func (k *Kms) loadRoot(ctx context.Context, scopeId string, opt ...Option) (*mul externalWrappers := k.externalScopeCache[scope.Global.String()] k.externalScopeCacheMutex.Unlock() if externalWrappers == nil { - return nil, "", errors.New(errors.KeyNotFound, op, "could not find kms information at either the needed scope or global fallback") + return nil, "", errors.New(ctx, errors.KeyNotFound, op, "could not find kms information at either the needed scope or global fallback") } externalWrappers.m.RLock() defer externalWrappers.m.RUnlock() if externalWrappers.root == nil { - return nil, "", errors.New(errors.InvalidParameter, op, fmt.Sprintf("root key wrapper for scope %s is nil", scopeId)) + return nil, "", errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("root key wrapper for scope %s is nil", scopeId)) } rootKeyVersions, err := repo.ListRootKeyVersions(ctx, externalWrappers.root, rootKeyId, WithOrderByVersion(db.DescendingOrderBy)) if err != nil { - return nil, "", errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error looking up root key versions for scope %s with key ID %s", scopeId, externalWrappers.root.KeyID()))) + return nil, "", errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error looking up root key versions for scope %s with key ID %s", scopeId, externalWrappers.root.KeyID()))) } if len(rootKeyVersions) == 0 { - return nil, "", errors.New(errors.KeyNotFound, op, fmt.Sprintf("no root key versions found for scope %s", scopeId)) + return nil, "", errors.New(ctx, errors.KeyNotFound, op, fmt.Sprintf("no root key versions found for scope %s", scopeId)) } var multi *multiwrapper.MultiWrapper @@ -262,10 +262,10 @@ func (k *Kms) loadRoot(ctx context.Context, scopeId string, opt ...Option) (*mul if _, err := wrapper.SetConfig(map[string]string{ "key_id": key.GetPrivateId(), }); err != nil { - return nil, "", errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error setting config on aead root wrapper in scope %s", scopeId))) + return nil, "", errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error setting config on aead root wrapper in scope %s", scopeId))) } if err := wrapper.SetAESGCMKeyBytes(key.GetKey()); err != nil { - return nil, "", errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error setting key bytes on aead root wrapper in scope %s", scopeId))) + return nil, "", errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error setting key bytes on aead root wrapper in scope %s", scopeId))) } if i == 0 { multi = multiwrapper.NewMultiWrapper(wrapper) @@ -292,10 +292,10 @@ type DekVersion interface { func (k *Kms) loadDek(ctx context.Context, scopeId string, purpose KeyPurpose, rootWrapper wrapping.Wrapper, rootKeyId string, opt ...Option) (*multiwrapper.MultiWrapper, error) { const op = "kms.loadDek" if rootWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("nil root wrapper for scope %s", scopeId)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("nil root wrapper for scope %s", scopeId)) } if rootKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("missing root key ID for scope %s", scopeId)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("missing root key ID for scope %s", scopeId)) } opts := getOpts(opt...) @@ -318,10 +318,10 @@ func (k *Kms) loadDek(ctx context.Context, scopeId string, purpose KeyPurpose, r case KeyPurposeOidc: keys, err = repo.ListOidcKeys(ctx) default: - return nil, errors.New(errors.InvalidParameter, op, "unknown or invalid DEK purpose specified") + return nil, errors.New(ctx, errors.InvalidParameter, op, "unknown or invalid DEK purpose specified") } if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("error listing root keys")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("error listing root keys")) } var keyId string for _, k := range keys { @@ -331,7 +331,7 @@ func (k *Kms) loadDek(ctx context.Context, scopeId string, purpose KeyPurpose, r } } if keyId == "" { - return nil, errors.New(errors.KeyNotFound, op, fmt.Sprintf("error finding %s key for scope %s", purpose.String(), scopeId)) + return nil, errors.New(ctx, errors.KeyNotFound, op, fmt.Sprintf("error finding %s key for scope %s", purpose.String(), scopeId)) } var keyVersions []DekVersion @@ -347,13 +347,13 @@ func (k *Kms) loadDek(ctx context.Context, scopeId string, purpose KeyPurpose, r case KeyPurposeOidc: keyVersions, err = repo.ListOidcKeyVersions(ctx, rootWrapper, keyId, WithOrderByVersion(db.DescendingOrderBy)) default: - return nil, errors.New(errors.InvalidParameter, op, "unknown or invalid DEK purpose specified") + return nil, errors.New(ctx, errors.InvalidParameter, op, "unknown or invalid DEK purpose specified") } if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error looking up %s key versions for scope %s with key ID %s", purpose.String(), scopeId, rootWrapper.KeyID()))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error looking up %s key versions for scope %s with key ID %s", purpose.String(), scopeId, rootWrapper.KeyID()))) } if len(keyVersions) == 0 { - return nil, errors.New(errors.KeyNotFound, op, fmt.Sprintf("no %s key versions found for scope %s", purpose.String(), scopeId)) + return nil, errors.New(ctx, errors.KeyNotFound, op, fmt.Sprintf("no %s key versions found for scope %s", purpose.String(), scopeId)) } var multi *multiwrapper.MultiWrapper @@ -362,10 +362,10 @@ func (k *Kms) loadDek(ctx context.Context, scopeId string, purpose KeyPurpose, r if _, err := wrapper.SetConfig(map[string]string{ "key_id": keyVersion.GetPrivateId(), }); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error setting config on aead %s wrapper in scope %s", purpose.String(), scopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error setting config on aead %s wrapper in scope %s", purpose.String(), scopeId))) } if err := wrapper.SetAESGCMKeyBytes(keyVersion.GetKey()); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error setting key bytes on aead %s wrapper in scope %s", purpose.String(), scopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error setting key bytes on aead %s wrapper in scope %s", purpose.String(), scopeId))) } if i == 0 { multi = multiwrapper.NewMultiWrapper(wrapper) @@ -387,10 +387,10 @@ func (k *Kms) loadDek(ctx context.Context, scopeId string, purpose KeyPurpose, r func NewDerivedReader(wrapper wrapping.Wrapper, lenLimit int64, salt, info []byte) (*io.LimitedReader, error) { const op = "kms.NewDerivedReader" if wrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing wrapper") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing wrapper") } if lenLimit < 20 { - return nil, errors.New(errors.InvalidParameter, op, "lenLimit must be >= 20") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "lenLimit must be >= 20") } var aeadWrapper *aead.Wrapper switch w := wrapper.(type) { @@ -398,15 +398,15 @@ func NewDerivedReader(wrapper wrapping.Wrapper, lenLimit int64, salt, info []byt raw := w.WrapperForKeyID("__base__") var ok bool if aeadWrapper, ok = raw.(*aead.Wrapper); !ok { - return nil, errors.New(errors.InvalidParameter, op, "unexpected wrapper type from multiwrapper base") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "unexpected wrapper type from multiwrapper base") } case *aead.Wrapper: if w.GetKeyBytes() == nil { - return nil, errors.New(errors.InvalidParameter, op, "aead wrapper missing bytes") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "aead wrapper missing bytes") } aeadWrapper = w default: - return nil, errors.New(errors.InvalidParameter, op, "unknown wrapper type") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "unknown wrapper type") } reader := hkdf.New(sha256.New, aeadWrapper.GetKeyBytes(), salt, info) return &io.LimitedReader{ diff --git a/internal/kms/oidc_key.go b/internal/kms/oidc_key.go index 7216ef0f8..c3acff7ed 100644 --- a/internal/kms/oidc_key.go +++ b/internal/kms/oidc_key.go @@ -24,7 +24,7 @@ type OidcKey struct { func NewOidcKey(rootKeyId string, _ ...Option) (*OidcKey, error) { const op = "kms.NewOidcKey" if rootKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing root key id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing root key id") } c := &OidcKey{ OidcKey: &store.OidcKey{ @@ -54,15 +54,15 @@ func (k *OidcKey) Clone() interface{} { func (k *OidcKey) VetForWrite(ctx context.Context, r db.Reader, opType db.OpType, opt ...db.Option) error { const op = "kms.(OidcKey).VetForWrite" if k.PrivateId == "" { - return errors.New(errors.InvalidParameter, op, "missing private id") + return errors.New(ctx, errors.InvalidParameter, op, "missing private id") } switch opType { case db.CreateOp: if k.RootKeyId == "" { - return errors.New(errors.InvalidParameter, op, "missing root key id") + return errors.New(ctx, errors.InvalidParameter, op, "missing root key id") } case db.UpdateOp: - return errors.New(errors.InvalidParameter, op, "key is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "key is immutable") } return nil } diff --git a/internal/kms/oidc_key_version.go b/internal/kms/oidc_key_version.go index c344d217a..af2971f5e 100644 --- a/internal/kms/oidc_key_version.go +++ b/internal/kms/oidc_key_version.go @@ -26,13 +26,13 @@ type OidcKeyVersion struct { func NewOidcKeyVersion(oidcKeyId string, key []byte, rootKeyVersionId string, _ ...Option) (*OidcKeyVersion, error) { const op = "kms.NewOidcKeyVersion" if oidcKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing oidc key id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing oidc key id") } if len(key) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing key") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing key") } if rootKeyVersionId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing root key version id") } k := &OidcKeyVersion{ @@ -65,21 +65,21 @@ func (k *OidcKeyVersion) Clone() interface{} { func (k *OidcKeyVersion) VetForWrite(ctx context.Context, r db.Reader, opType db.OpType, opt ...db.Option) error { const op = "kms.(OidcKeyVersion).VetForWrite" if k.PrivateId == "" { - return errors.New(errors.InvalidParameter, op, "missing private id") + return errors.New(ctx, errors.InvalidParameter, op, "missing private id") } switch opType { case db.CreateOp: if k.CtKey == nil { - return errors.New(errors.InvalidParameter, op, "missing key") + return errors.New(ctx, errors.InvalidParameter, op, "missing key") } if k.OidcKeyId == "" { - return errors.New(errors.InvalidParameter, op, "missing oidc key id") + return errors.New(ctx, errors.InvalidParameter, op, "missing oidc key id") } if k.RootKeyVersionId == "" { - return errors.New(errors.InvalidParameter, op, "missing root key version id") + return errors.New(ctx, errors.InvalidParameter, op, "missing root key version id") } case db.UpdateOp: - return errors.New(errors.InvalidParameter, op, "key is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "key is immutable") } return nil } @@ -105,7 +105,7 @@ func (k *OidcKeyVersion) Encrypt(ctx context.Context, cipher wrapping.Wrapper) e // structwrapping doesn't support embedding, so we'll pass in the // store.OidcKeyVersion directly if err := structwrapping.WrapStruct(ctx, cipher, k.OidcKeyVersion, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Encrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt)) } return nil } @@ -116,7 +116,7 @@ func (k *OidcKeyVersion) Decrypt(ctx context.Context, cipher wrapping.Wrapper) e // structwrapping doesn't support embedding, so we'll pass in the // store.OidcKeyVersion directly if err := structwrapping.UnwrapStruct(ctx, cipher, k.OidcKeyVersion, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Decrypt)) } return nil } diff --git a/internal/kms/oplog_key.go b/internal/kms/oplog_key.go index c674ad4d1..6eb724aee 100644 --- a/internal/kms/oplog_key.go +++ b/internal/kms/oplog_key.go @@ -23,7 +23,7 @@ type OplogKey struct { func NewOplogKey(rootKeyId string, _ ...Option) (*OplogKey, error) { const op = "kms.NewOplogKey" if rootKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing root key id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing root key id") } c := &OplogKey{ OplogKey: &store.OplogKey{ @@ -50,14 +50,14 @@ func (k *OplogKey) Clone() interface{} { // VetForWrite implements db.VetForWrite() interface and validates the key // before it's written. -func (k *OplogKey) VetForWrite(_ context.Context, _ db.Reader, opType db.OpType, _ ...db.Option) error { +func (k *OplogKey) VetForWrite(ctx context.Context, _ db.Reader, opType db.OpType, _ ...db.Option) error { const op = "kms.(OplogKey).VetForWrite" if k.PrivateId == "" { - return errors.New(errors.InvalidParameter, op, "missing private id") + return errors.New(ctx, errors.InvalidParameter, op, "missing private id") } if opType == db.CreateOp { if k.RootKeyId == "" { - return errors.New(errors.InvalidParameter, op, "missing root key id") + return errors.New(ctx, errors.InvalidParameter, op, "missing root key id") } } return nil diff --git a/internal/kms/oplog_key_version.go b/internal/kms/oplog_key_version.go index 5d36dbde9..4f87196d8 100644 --- a/internal/kms/oplog_key_version.go +++ b/internal/kms/oplog_key_version.go @@ -25,13 +25,13 @@ type OplogKeyVersion struct { func NewOplogKeyVersion(oplogKeyId string, key []byte, rootKeyVersionId string, _ ...Option) (*OplogKeyVersion, error) { const op = "kms.NewOplogKeyVersion" if oplogKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing oplog key id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing oplog key id") } if len(key) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing key") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing key") } if rootKeyVersionId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing root key version id") } k := &OplogKeyVersion{ @@ -61,20 +61,20 @@ func (k *OplogKeyVersion) Clone() interface{} { // VetForWrite implements db.VetForWrite() interface and validates the key // version before it's written. -func (k *OplogKeyVersion) VetForWrite(_ context.Context, _ db.Reader, opType db.OpType, _ ...db.Option) error { +func (k *OplogKeyVersion) VetForWrite(ctx context.Context, _ db.Reader, opType db.OpType, _ ...db.Option) error { const op = "kms.(OplogKeyVersion).VetForWrite" if k.PrivateId == "" { - return errors.New(errors.InvalidParameter, op, "missing private id") + return errors.New(ctx, errors.InvalidParameter, op, "missing private id") } if opType == db.CreateOp { if k.CtKey == nil { - return errors.New(errors.InvalidParameter, op, "missing key") + return errors.New(ctx, errors.InvalidParameter, op, "missing key") } if k.OplogKeyId == "" { - return errors.New(errors.InvalidParameter, op, "missing oplog key id") + return errors.New(ctx, errors.InvalidParameter, op, "missing oplog key id") } if k.RootKeyVersionId == "" { - return errors.New(errors.InvalidParameter, op, "missing root key version id") + return errors.New(ctx, errors.InvalidParameter, op, "missing root key version id") } } return nil @@ -101,7 +101,7 @@ func (k *OplogKeyVersion) Encrypt(ctx context.Context, cipher wrapping.Wrapper) // structwrapping doesn't support embedding, so we'll pass in the // store.OplogKeyVersion directly if err := structwrapping.WrapStruct(ctx, cipher, k.OplogKeyVersion, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Encrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt)) } return nil } @@ -112,7 +112,7 @@ func (k *OplogKeyVersion) Decrypt(ctx context.Context, cipher wrapping.Wrapper) // structwrapping doesn't support embedding, so we'll pass in the // store.OplogKeyVersion directly if err := structwrapping.UnwrapStruct(ctx, cipher, k.OplogKeyVersion, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Decrypt)) } return nil } diff --git a/internal/kms/repository.go b/internal/kms/repository.go index 00e405b32..25dc99588 100644 --- a/internal/kms/repository.go +++ b/internal/kms/repository.go @@ -25,10 +25,10 @@ type Repository struct { func NewRepository(r db.Reader, w db.Writer, opt ...Option) (*Repository, error) { const op = "kms.NewRepository" if r == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil reader") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil reader") } if w == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil writer") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil writer") } opts := getOpts(opt...) if opts.withLimit == 0 { @@ -84,82 +84,82 @@ type Keys map[KeyType]KeyIder func CreateKeysTx(ctx context.Context, dbReader db.Reader, dbWriter db.Writer, rootWrapper wrapping.Wrapper, randomReader io.Reader, scopeId string) (Keys, error) { const op = "kms.CreateKeysTx" if dbReader == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing db reader") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing db reader") } if dbWriter == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing db writer") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing db writer") } if rootWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing root wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root wrapper") } if randomReader == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing random reader") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing random reader") } if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } - k, err := generateKey(randomReader) + k, err := generateKey(ctx, randomReader) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error generating random bytes for root key in scope %s", scopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error generating random bytes for root key in scope %s", scopeId))) } rootKey, rootKeyVersion, err := createRootKeyTx(ctx, dbWriter, rootWrapper, scopeId, k) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to create root key in scope %s", scopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to create root key in scope %s", scopeId))) } rkvWrapper := aead.NewWrapper(nil) if _, err := rkvWrapper.SetConfig(map[string]string{ "key_id": rootKeyVersion.GetPrivateId(), }); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error setting config on aead root wrapper in scope %s", scopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error setting config on aead root wrapper in scope %s", scopeId))) } if err := rkvWrapper.SetAESGCMKeyBytes(rootKeyVersion.GetKey()); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error setting key bytes on aead root wrapper in scope %s", scopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error setting key bytes on aead root wrapper in scope %s", scopeId))) } - k, err = generateKey(randomReader) + k, err = generateKey(ctx, randomReader) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error generating random bytes for database key in scope %s", scopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error generating random bytes for database key in scope %s", scopeId))) } dbKey, dbKeyVersion, err := createDatabaseKeyTx(ctx, dbReader, dbWriter, rkvWrapper, k) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to create database key in scope %s", scopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to create database key in scope %s", scopeId))) } - k, err = generateKey(randomReader) + k, err = generateKey(ctx, randomReader) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error generating random bytes for oplog key in scope %s", scopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error generating random bytes for oplog key in scope %s", scopeId))) } oplogKey, oplogKeyVersion, err := createOplogKeyTx(ctx, dbReader, dbWriter, rkvWrapper, k) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to create oplog key in scope %s", scopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to create oplog key in scope %s", scopeId))) } - k, err = generateKey(randomReader) + k, err = generateKey(ctx, randomReader) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error generating random bytes for session key in scope %s", scopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error generating random bytes for session key in scope %s", scopeId))) } sessionKey, sessionKeyVersion, err := createSessionKeyTx(ctx, dbReader, dbWriter, rkvWrapper, k) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to create session key in scope %s", scopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to create session key in scope %s", scopeId))) } - k, err = generateKey(randomReader) + k, err = generateKey(ctx, randomReader) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error generating random bytes for token key in scope %s", scopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error generating random bytes for token key in scope %s", scopeId))) } tokenKey, tokenKeyVersion, err := createTokenKeyTx(ctx, dbReader, dbWriter, rkvWrapper, k) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to create token key in scope %s", scopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to create token key in scope %s", scopeId))) } - k, err = generateKey(randomReader) + k, err = generateKey(ctx, randomReader) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error generating random bytes for oidc key in scope %s", scopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error generating random bytes for oidc key in scope %s", scopeId))) } oidcKey, oidcKeyVersion, err := createOidcKeyTx(ctx, dbReader, dbWriter, rkvWrapper, k) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to create oidc key in scope %s", scopeId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to create oidc key in scope %s", scopeId))) } keys := Keys{ @@ -179,11 +179,11 @@ func CreateKeysTx(ctx context.Context, dbReader db.Reader, dbWriter db.Writer, r return keys, nil } -func generateKey(randomReader io.Reader) ([]byte, error) { +func generateKey(ctx context.Context, randomReader io.Reader) ([]byte, error) { const op = "kms.generateKey" k, err := uuid.GenerateRandomBytesWithReader(32, randomReader) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return k, nil } diff --git a/internal/kms/repository_database_key.go b/internal/kms/repository_database_key.go index 5807934d3..f9a27f405 100644 --- a/internal/kms/repository_database_key.go +++ b/internal/kms/repository_database_key.go @@ -22,13 +22,13 @@ func (r *Repository) CreateDatabaseKey(ctx context.Context, rkvWrapper wrapping. func(reader db.Reader, w db.Writer) error { var err error if returnedDk, returnedDv, err = createDatabaseKeyTx(ctx, reader, w, rkvWrapper, key); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } return returnedDk.(*DatabaseKey), returnedDv.(*DatabaseKeyVersion), nil } @@ -39,53 +39,53 @@ func (r *Repository) CreateDatabaseKey(ctx context.Context, rkvWrapper wrapping. func createDatabaseKeyTx(ctx context.Context, r db.Reader, w db.Writer, rkvWrapper wrapping.Wrapper, key []byte) (*DatabaseKey, *DatabaseKeyVersion, error) { const op = "kms.createDatabaseKeyTx" if rkvWrapper == nil { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing key wrapper") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing key wrapper") } if len(key) == 0 { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing key") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing key") } rootKeyVersionId := rkvWrapper.KeyID() switch { case !strings.HasPrefix(rootKeyVersionId, RootKeyVersionPrefix): - return nil, nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) case rootKeyVersionId == "": - return nil, nil, errors.New(errors.InvalidParameter, op, "missing root key version id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version id") } rv := AllocRootKeyVersion() rv.PrivateId = rootKeyVersionId err := r.LookupById(ctx, &rv) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to lookup root key version %s", rootKeyVersionId))) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to lookup root key version %s", rootKeyVersionId))) } dk := AllocDatabaseKey() dv := AllocDatabaseKeyVersion() id, err := newDatabaseKeyId() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } dk.PrivateId = id dk.RootKeyId = rv.RootKeyId id, err = newDatabaseKeyVersionId() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } dv.PrivateId = id dv.DatabaseKeyId = dk.PrivateId dv.RootKeyVersionId = rootKeyVersionId dv.Key = key if err := dv.Encrypt(ctx, rkvWrapper); err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } // no oplog entries for keys if err := w.Create(ctx, &dk); err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("keys create")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("keys create")) } // no oplog entries for key versions if err := w.Create(ctx, &dv); err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("key versions create")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("key versions create")) } return &dk, &dv, nil @@ -96,12 +96,12 @@ func createDatabaseKeyTx(ctx context.Context, r db.Reader, w db.Writer, rkvWrapp func (r *Repository) LookupDatabaseKey(ctx context.Context, privateId string, _ ...Option) (*DatabaseKey, error) { const op = "kms.(Repository).LookupDatabaseKey" if privateId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing private id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } k := AllocDatabaseKey() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } return &k, nil } @@ -112,12 +112,12 @@ func (r *Repository) LookupDatabaseKey(ctx context.Context, privateId string, _ func (r *Repository) DeleteDatabaseKey(ctx context.Context, privateId string, _ ...Option) (int, error) { const op = "kms.(Repository).LookupDatabaseKey" if privateId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing private id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } k := AllocDatabaseKey() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } var rowsDeleted int @@ -130,16 +130,16 @@ func (r *Repository) DeleteDatabaseKey(ctx context.Context, privateId string, _ // no oplog entries for root keys rowsDeleted, err = w.Delete(ctx, dk) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } return rowsDeleted, nil } @@ -150,7 +150,7 @@ func (r *Repository) ListDatabaseKeys(ctx context.Context, opt ...Option) ([]Dek var keys []*DatabaseKey err := r.list(ctx, &keys, "1=1", nil, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } deks := make([]Dek, 0, len(keys)) for _, key := range keys { diff --git a/internal/kms/repository_database_key_version.go b/internal/kms/repository_database_key_version.go index 715313904..cc53818a5 100644 --- a/internal/kms/repository_database_key_version.go +++ b/internal/kms/repository_database_key_version.go @@ -15,32 +15,32 @@ import ( func (r *Repository) CreateDatabaseKeyVersion(ctx context.Context, rkvWrapper wrapping.Wrapper, databaseKeyId string, key []byte, _ ...Option) (*DatabaseKeyVersion, error) { const op = "kms.(Repository).CreateDatabaseKeyVersion" if rkvWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version wrapper") } rootKeyVersionId := rkvWrapper.KeyID() switch { case !strings.HasPrefix(rootKeyVersionId, RootKeyVersionPrefix): - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) case rootKeyVersionId == "": - return nil, errors.New(errors.InvalidParameter, op, "missing root key version id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version id") } if databaseKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing database key id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing database key id") } if len(key) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing key") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing key") } kv := AllocDatabaseKeyVersion() id, err := newDatabaseKeyVersionId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } kv.PrivateId = id kv.RootKeyVersionId = rootKeyVersionId kv.Key = key kv.DatabaseKeyId = databaseKeyId if err := kv.Encrypt(ctx, rkvWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } var returnedKey interface{} @@ -52,13 +52,13 @@ func (r *Repository) CreateDatabaseKeyVersion(ctx context.Context, rkvWrapper wr returnedKey = kv.Clone() // no oplog entries for root key version if err := w.Create(ctx, returnedKey); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s database key id", kv.DatabaseKeyId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s database key id", kv.DatabaseKeyId))) } return returnedKey.(*DatabaseKeyVersion), nil } @@ -68,18 +68,18 @@ func (r *Repository) CreateDatabaseKeyVersion(ctx context.Context, rkvWrapper wr func (r *Repository) LookupDatabaseKeyVersion(ctx context.Context, keyWrapper wrapping.Wrapper, privateId string, _ ...Option) (*DatabaseKeyVersion, error) { const op = "kms.(Repository).LookupDatabaseKeyVersion" if privateId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing private id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } if keyWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing key wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing key wrapper") } k := AllocDatabaseKeyVersion() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } if err := k.Decrypt(ctx, keyWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return &k, nil } @@ -90,12 +90,12 @@ func (r *Repository) LookupDatabaseKeyVersion(ctx context.Context, keyWrapper wr func (r *Repository) DeleteDatabaseKeyVersion(ctx context.Context, privateId string, _ ...Option) (int, error) { const op = "kms.(Repository).DeleteDatabaseKeyVersion" if privateId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing private id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } k := AllocDatabaseKeyVersion() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } var rowsDeleted int @@ -108,16 +108,16 @@ func (r *Repository) DeleteDatabaseKeyVersion(ctx context.Context, privateId str // no oplog entries for the key version rowsDeleted, err = w.Delete(ctx, dk) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } return rowsDeleted, nil } @@ -128,20 +128,20 @@ func (r *Repository) DeleteDatabaseKeyVersion(ctx context.Context, privateId str func (r *Repository) LatestDatabaseKeyVersion(ctx context.Context, rkvWrapper wrapping.Wrapper, databaseKeyId string, _ ...Option) (*DatabaseKeyVersion, error) { const op = "kms.(Repository).LatestDatabaseKeyVersion" if databaseKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing database key id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing database key id") } if rkvWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version wrapper") } var foundKeys []*DatabaseKeyVersion if err := r.reader.SearchWhere(ctx, &foundKeys, "database_key_id = ?", []interface{}{databaseKeyId}, db.WithLimit(1), db.WithOrder("version desc")); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", databaseKeyId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", databaseKeyId))) } if len(foundKeys) == 0 { - return nil, errors.E(errors.WithCode(errors.RecordNotFound), errors.WithOp(op)) + return nil, errors.E(ctx, errors.WithCode(errors.RecordNotFound), errors.WithOp(op)) } if err := foundKeys[0].Decrypt(ctx, rkvWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return foundKeys[0], nil } @@ -150,19 +150,19 @@ func (r *Repository) LatestDatabaseKeyVersion(ctx context.Context, rkvWrapper wr func (r *Repository) ListDatabaseKeyVersions(ctx context.Context, rkvWrapper wrapping.Wrapper, databaseKeyId string, opt ...Option) ([]DekVersion, error) { const op = "kms.(Repository).ListDatabaseKeyVersions" if databaseKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing database key id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing database key id") } if rkvWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version wrapper") } var versions []*DatabaseKeyVersion err := r.list(ctx, &versions, "database_key_id = ?", []interface{}{databaseKeyId}, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } for i, k := range versions { if err := k.Decrypt(ctx, rkvWrapper); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error decrypting key num %d", i))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error decrypting key num %d", i))) } } dekVersions := make([]DekVersion, 0, len(versions)) diff --git a/internal/kms/repository_oidc_key.go b/internal/kms/repository_oidc_key.go index e282526f2..b43676ec5 100644 --- a/internal/kms/repository_oidc_key.go +++ b/internal/kms/repository_oidc_key.go @@ -22,13 +22,13 @@ func (r *Repository) CreateOidcKey(ctx context.Context, rkvWrapper wrapping.Wrap func(reader db.Reader, w db.Writer) error { var err error if returnedDk, returnedDv, err = createOidcKeyTx(ctx, reader, w, rkvWrapper, key); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } return returnedDk.(*OidcKey), returnedDv.(*OidcKeyVersion), nil } @@ -39,53 +39,53 @@ func (r *Repository) CreateOidcKey(ctx context.Context, rkvWrapper wrapping.Wrap func createOidcKeyTx(ctx context.Context, r db.Reader, w db.Writer, rkvWrapper wrapping.Wrapper, key []byte) (*OidcKey, *OidcKeyVersion, error) { const op = "kms.createOidcKeyTx" if rkvWrapper == nil { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing key wrapper") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing key wrapper") } if len(key) == 0 { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing key") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing key") } rootKeyVersionId := rkvWrapper.KeyID() switch { case !strings.HasPrefix(rootKeyVersionId, RootKeyVersionPrefix): - return nil, nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) case rootKeyVersionId == "": - return nil, nil, errors.New(errors.InvalidParameter, op, "missing root key version id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version id") } rv := AllocRootKeyVersion() rv.PrivateId = rootKeyVersionId err := r.LookupById(ctx, &rv) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to lookup root key version %s", rootKeyVersionId))) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to lookup root key version %s", rootKeyVersionId))) } dk := AllocOidcKey() dv := AllocOidcKeyVersion() id, err := newOidcKeyId() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } dk.PrivateId = id dk.RootKeyId = rv.RootKeyId id, err = newOidcKeyVersionId() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } dv.PrivateId = id dv.OidcKeyId = dk.PrivateId dv.RootKeyVersionId = rootKeyVersionId dv.Key = key if err := dv.Encrypt(ctx, rkvWrapper); err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } // no oplog entries for keys if err := w.Create(ctx, &dk); err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("keys create")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("keys create")) } // no oplog entries for key versions if err := w.Create(ctx, &dv); err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("key versions create")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("key versions create")) } return &dk, &dv, nil @@ -96,12 +96,12 @@ func createOidcKeyTx(ctx context.Context, r db.Reader, w db.Writer, rkvWrapper w func (r *Repository) LookupOidcKey(ctx context.Context, privateId string, _ ...Option) (*OidcKey, error) { const op = "kms.(Repository).LookupOidcKey" if privateId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing private id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } k := AllocOidcKey() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } return &k, nil } @@ -112,12 +112,12 @@ func (r *Repository) LookupOidcKey(ctx context.Context, privateId string, _ ...O func (r *Repository) DeleteOidcKey(ctx context.Context, privateId string, _ ...Option) (int, error) { const op = "kms.(Repository).LookupOidcKey" if privateId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing private id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } k := AllocOidcKey() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } var rowsDeleted int @@ -130,16 +130,16 @@ func (r *Repository) DeleteOidcKey(ctx context.Context, privateId string, _ ...O // no oplog entries for root keys rowsDeleted, err = w.Delete(ctx, dk) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } return rowsDeleted, nil } @@ -150,7 +150,7 @@ func (r *Repository) ListOidcKeys(ctx context.Context, opt ...Option) ([]Dek, er var keys []*OidcKey err := r.list(ctx, &keys, "1=1", nil, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } deks := make([]Dek, 0, len(keys)) for _, key := range keys { diff --git a/internal/kms/repository_oidc_key_version.go b/internal/kms/repository_oidc_key_version.go index 249d4001d..00648b3ab 100644 --- a/internal/kms/repository_oidc_key_version.go +++ b/internal/kms/repository_oidc_key_version.go @@ -15,32 +15,32 @@ import ( func (r *Repository) CreateOidcKeyVersion(ctx context.Context, rkvWrapper wrapping.Wrapper, oidcKeyId string, key []byte, _ ...Option) (*OidcKeyVersion, error) { const op = "kms.(Repository).CreateOidcKeyVersion" if rkvWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version wrapper") } rootKeyVersionId := rkvWrapper.KeyID() switch { case !strings.HasPrefix(rootKeyVersionId, RootKeyVersionPrefix): - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) case rootKeyVersionId == "": - return nil, errors.New(errors.InvalidParameter, op, "missing root key version id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version id") } if oidcKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing oidc key id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing oidc key id") } if len(key) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing key") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing key") } kv := AllocOidcKeyVersion() id, err := newOidcKeyVersionId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } kv.PrivateId = id kv.RootKeyVersionId = rootKeyVersionId kv.Key = key kv.OidcKeyId = oidcKeyId if err := kv.Encrypt(ctx, rkvWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } var returnedKey interface{} @@ -52,13 +52,13 @@ func (r *Repository) CreateOidcKeyVersion(ctx context.Context, rkvWrapper wrappi returnedKey = kv.Clone() // no oplog entries for root key version if err := w.Create(ctx, returnedKey); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s oidc key id", kv.OidcKeyId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s oidc key id", kv.OidcKeyId))) } return returnedKey.(*OidcKeyVersion), nil } @@ -68,18 +68,18 @@ func (r *Repository) CreateOidcKeyVersion(ctx context.Context, rkvWrapper wrappi func (r *Repository) LookupOidcKeyVersion(ctx context.Context, keyWrapper wrapping.Wrapper, privateId string, _ ...Option) (*OidcKeyVersion, error) { const op = "kms.(Repository).LookupOidcKeyVersion" if privateId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing private id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } if keyWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing key wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing key wrapper") } k := AllocOidcKeyVersion() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } if err := k.Decrypt(ctx, keyWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return &k, nil } @@ -90,12 +90,12 @@ func (r *Repository) LookupOidcKeyVersion(ctx context.Context, keyWrapper wrappi func (r *Repository) DeleteOidcKeyVersion(ctx context.Context, privateId string, _ ...Option) (int, error) { const op = "kms.(Repository).DeleteOidcKeyVersion" if privateId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing private id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } k := AllocOidcKeyVersion() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } var rowsDeleted int @@ -108,16 +108,16 @@ func (r *Repository) DeleteOidcKeyVersion(ctx context.Context, privateId string, // no oplog entries for the key version rowsDeleted, err = w.Delete(ctx, dk) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } return rowsDeleted, nil } @@ -128,20 +128,20 @@ func (r *Repository) DeleteOidcKeyVersion(ctx context.Context, privateId string, func (r *Repository) LatestOidcKeyVersion(ctx context.Context, rkvWrapper wrapping.Wrapper, OidcKeyId string, _ ...Option) (*OidcKeyVersion, error) { const op = "kms.(Repository).LatestOidcKeyVersion" if OidcKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing oidc key id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing oidc key id") } if rkvWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version wrapper") } var foundKeys []*OidcKeyVersion if err := r.reader.SearchWhere(ctx, &foundKeys, "oidc_key_id = ?", []interface{}{OidcKeyId}, db.WithLimit(1), db.WithOrder("version desc")); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", OidcKeyId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", OidcKeyId))) } if len(foundKeys) == 0 { - return nil, errors.E(errors.WithCode(errors.RecordNotFound), errors.WithOp(op)) + return nil, errors.E(ctx, errors.WithCode(errors.RecordNotFound), errors.WithOp(op)) } if err := foundKeys[0].Decrypt(ctx, rkvWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return foundKeys[0], nil } @@ -150,19 +150,19 @@ func (r *Repository) LatestOidcKeyVersion(ctx context.Context, rkvWrapper wrappi func (r *Repository) ListOidcKeyVersions(ctx context.Context, rkvWrapper wrapping.Wrapper, OidcKeyId string, opt ...Option) ([]DekVersion, error) { const op = "kms.(Repository).ListOidcKeyVersions" if OidcKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing oidc key id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing oidc key id") } if rkvWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version wrapper") } var versions []*OidcKeyVersion err := r.list(ctx, &versions, "oidc_key_id = ?", []interface{}{OidcKeyId}, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } for i, k := range versions { if err := k.Decrypt(ctx, rkvWrapper); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error decrypting key num %d", i))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error decrypting key num %d", i))) } } dekVersions := make([]DekVersion, 0, len(versions)) diff --git a/internal/kms/repository_oplog_key.go b/internal/kms/repository_oplog_key.go index 2b5a7afdd..cc39e54a8 100644 --- a/internal/kms/repository_oplog_key.go +++ b/internal/kms/repository_oplog_key.go @@ -22,13 +22,13 @@ func (r *Repository) CreateOplogKey(ctx context.Context, rkvWrapper wrapping.Wra func(reader db.Reader, w db.Writer) error { var err error if returnedDk, returnedDv, err = createOplogKeyTx(ctx, reader, w, rkvWrapper, key); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } return returnedDk.(*OplogKey), returnedDv.(*OplogKeyVersion), nil } @@ -39,53 +39,53 @@ func (r *Repository) CreateOplogKey(ctx context.Context, rkvWrapper wrapping.Wra func createOplogKeyTx(ctx context.Context, r db.Reader, w db.Writer, rkvWrapper wrapping.Wrapper, key []byte) (*OplogKey, *OplogKeyVersion, error) { const op = "kms.createOplogKeyTx" if rkvWrapper == nil { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing key wrapper") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing key wrapper") } if len(key) == 0 { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing key") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing key") } rootKeyVersionId := rkvWrapper.KeyID() switch { case !strings.HasPrefix(rootKeyVersionId, RootKeyVersionPrefix): - return nil, nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) case rootKeyVersionId == "": - return nil, nil, errors.New(errors.InvalidParameter, op, "missing root key version id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version id") } rv := AllocRootKeyVersion() rv.PrivateId = rootKeyVersionId err := r.LookupById(ctx, &rv) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to lookup root key version %s", rootKeyVersionId))) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to lookup root key version %s", rootKeyVersionId))) } opk := AllocOplogKey() opv := AllocOplogKeyVersion() id, err := newOplogKeyId() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } opk.PrivateId = id opk.RootKeyId = rv.RootKeyId id, err = newOplogKeyVersionId() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } opv.PrivateId = id opv.OplogKeyId = opk.PrivateId opv.RootKeyVersionId = rootKeyVersionId opv.Key = key if err := opv.Encrypt(ctx, rkvWrapper); err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } // no oplog entries for keys if err := w.Create(ctx, &opk); err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("key create")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("key create")) } // no oplog entries for key versions if err := w.Create(ctx, &opv); err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("key versions create")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("key versions create")) } return &opk, &opv, nil @@ -96,12 +96,12 @@ func createOplogKeyTx(ctx context.Context, r db.Reader, w db.Writer, rkvWrapper func (r *Repository) LookupOplogKey(ctx context.Context, privateId string, _ ...Option) (*OplogKey, error) { const op = "kms.(Repository).LookupOplogKey" if privateId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing private id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } k := AllocOplogKey() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } return &k, nil } @@ -112,12 +112,12 @@ func (r *Repository) LookupOplogKey(ctx context.Context, privateId string, _ ... func (r *Repository) DeleteOplogKey(ctx context.Context, privateId string, _ ...Option) (int, error) { const op = "kms.(Repository).DeleteOplogKey" if privateId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing private id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } k := AllocOplogKey() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } var rowsDeleted int @@ -130,16 +130,16 @@ func (r *Repository) DeleteOplogKey(ctx context.Context, privateId string, _ ... // no oplog entries for root keys rowsDeleted, err = w.Delete(ctx, dk) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } return rowsDeleted, nil } @@ -150,7 +150,7 @@ func (r *Repository) ListOplogKeys(ctx context.Context, opt ...Option) ([]Dek, e var keys []*OplogKey err := r.list(ctx, &keys, "1=1", nil, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } deks := make([]Dek, 0, len(keys)) for _, key := range keys { diff --git a/internal/kms/repository_oplog_key_version.go b/internal/kms/repository_oplog_key_version.go index a8d922809..92ab54b0b 100644 --- a/internal/kms/repository_oplog_key_version.go +++ b/internal/kms/repository_oplog_key_version.go @@ -15,32 +15,32 @@ import ( func (r *Repository) CreateOplogKeyVersion(ctx context.Context, rkvWrapper wrapping.Wrapper, oplogKeyId string, key []byte, _ ...Option) (*OplogKeyVersion, error) { const op = "kms.(Repository).CreateOplogKeyVersion" if rkvWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version wrapper") } rootKeyVersionId := rkvWrapper.KeyID() switch { case !strings.HasPrefix(rootKeyVersionId, RootKeyVersionPrefix): - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) case rootKeyVersionId == "": - return nil, errors.New(errors.InvalidParameter, op, "missing root key version id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version id") } if oplogKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing oplog key id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing oplog key id") } if len(key) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing key") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing key") } kv := AllocOplogKeyVersion() id, err := newOplogKeyVersionId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } kv.PrivateId = id kv.RootKeyVersionId = rootKeyVersionId kv.Key = key kv.OplogKeyId = oplogKeyId if err := kv.Encrypt(ctx, rkvWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } var returnedKey interface{} @@ -52,13 +52,13 @@ func (r *Repository) CreateOplogKeyVersion(ctx context.Context, rkvWrapper wrapp returnedKey = kv.Clone() // no oplog entries for root key version if err := w.Create(ctx, returnedKey); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s oplog key id", kv.OplogKeyId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s oplog key id", kv.OplogKeyId))) } return returnedKey.(*OplogKeyVersion), nil } @@ -68,18 +68,18 @@ func (r *Repository) CreateOplogKeyVersion(ctx context.Context, rkvWrapper wrapp func (r *Repository) LookupOplogKeyVersion(ctx context.Context, keyWrapper wrapping.Wrapper, privateId string, _ ...Option) (*OplogKeyVersion, error) { const op = "kms.(Repository).LookupOplogKeyVersion" if privateId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing private id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } if keyWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing key wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing key wrapper") } k := AllocOplogKeyVersion() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } if err := k.Decrypt(ctx, keyWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return &k, nil } @@ -90,12 +90,12 @@ func (r *Repository) LookupOplogKeyVersion(ctx context.Context, keyWrapper wrapp func (r *Repository) DeleteOplogKeyVersion(ctx context.Context, privateId string, _ ...Option) (int, error) { const op = "kms.(Repository).DeleteOplogKeyVersion" if privateId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing private id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } k := AllocOplogKeyVersion() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } var rowsDeleted int @@ -108,16 +108,16 @@ func (r *Repository) DeleteOplogKeyVersion(ctx context.Context, privateId string // no oplog entries for the key version rowsDeleted, err = w.Delete(ctx, dk) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } return rowsDeleted, nil } @@ -128,20 +128,20 @@ func (r *Repository) DeleteOplogKeyVersion(ctx context.Context, privateId string func (r *Repository) LatestOplogKeyVersion(ctx context.Context, rkvWrapper wrapping.Wrapper, oplogKeyId string, _ ...Option) (*OplogKeyVersion, error) { const op = "kms.(Repository).LatestOplogKeyVersion" if oplogKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing oplog key id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing oplog key id") } if rkvWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version wrapper") } var foundKeys []*OplogKeyVersion if err := r.reader.SearchWhere(ctx, &foundKeys, "oplog_key_id = ?", []interface{}{oplogKeyId}, db.WithLimit(1), db.WithOrder("version desc")); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", oplogKeyId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", oplogKeyId))) } if len(foundKeys) == 0 { - return nil, errors.E(errors.WithCode(errors.RecordNotFound), errors.WithOp(op)) + return nil, errors.E(ctx, errors.WithCode(errors.RecordNotFound), errors.WithOp(op)) } if err := foundKeys[0].Decrypt(ctx, rkvWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return foundKeys[0], nil } @@ -150,19 +150,19 @@ func (r *Repository) LatestOplogKeyVersion(ctx context.Context, rkvWrapper wrapp func (r *Repository) ListOplogKeyVersions(ctx context.Context, rkvWrapper wrapping.Wrapper, oplogKeyId string, opt ...Option) ([]DekVersion, error) { const op = "kms.(Repository).ListOplogKeyVersions" if oplogKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing oplog key id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing oplog key id") } if rkvWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version wrapper") } var versions []*OplogKeyVersion err := r.list(ctx, &versions, "oplog_key_id = ?", []interface{}{oplogKeyId}, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } for i, k := range versions { if err := k.Decrypt(ctx, rkvWrapper); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error decrypting key num %d", i))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error decrypting key num %d", i))) } } dekVersions := make([]DekVersion, 0, len(versions)) diff --git a/internal/kms/repository_root_key.go b/internal/kms/repository_root_key.go index 919036532..bae417164 100644 --- a/internal/kms/repository_root_key.go +++ b/internal/kms/repository_root_key.go @@ -21,13 +21,13 @@ func (r *Repository) CreateRootKey(ctx context.Context, keyWrapper wrapping.Wrap func(_ db.Reader, w db.Writer) error { var err error if returnedRk, returnedKv, err = createRootKeyTx(ctx, w, keyWrapper, scopeId, key); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", scopeId))) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", scopeId))) } return returnedRk.(*RootKey), returnedKv.(*RootKeyVersion), nil } @@ -38,41 +38,41 @@ func (r *Repository) CreateRootKey(ctx context.Context, keyWrapper wrapping.Wrap func createRootKeyTx(ctx context.Context, w db.Writer, keyWrapper wrapping.Wrapper, scopeId string, key []byte) (*RootKey, *RootKeyVersion, error) { const op = "kms.createRootKeyTx" if scopeId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } if keyWrapper == nil { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing key wrapper") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing key wrapper") } if len(key) == 0 { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing key") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing key") } rk := AllocRootKey() kv := AllocRootKeyVersion() id, err := newRootKeyId() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } rk.PrivateId = id rk.ScopeId = scopeId id, err = newRootKeyVersionId() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } kv.PrivateId = id kv.RootKeyId = rk.PrivateId kv.Key = key if err := kv.Encrypt(ctx, keyWrapper); err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } // no oplog entries for root keys if err := w.Create(ctx, &rk); err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("root keys")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("root keys")) } // no oplog entries for root key versions if err := w.Create(ctx, &kv); err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("key versions")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("key versions")) } return &rk, &kv, nil @@ -83,15 +83,15 @@ func createRootKeyTx(ctx context.Context, w db.Writer, keyWrapper wrapping.Wrapp func (r *Repository) LookupRootKey(ctx context.Context, keyWrapper wrapping.Wrapper, privateId string, _ ...Option) (*RootKey, error) { const op = "kms.(Repository).LookupRootKey" if privateId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing private id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } if keyWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing key wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing key wrapper") } k := AllocRootKey() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } return &k, nil } @@ -102,12 +102,12 @@ func (r *Repository) LookupRootKey(ctx context.Context, keyWrapper wrapping.Wrap func (r *Repository) DeleteRootKey(ctx context.Context, privateId string, _ ...Option) (int, error) { const op = "kms.(Repository).DeleteRootKey" if privateId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing private id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } k := AllocRootKey() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } var rowsDeleted int @@ -120,16 +120,16 @@ func (r *Repository) DeleteRootKey(ctx context.Context, privateId string, _ ...O // no oplog entries for root keys rowsDeleted, err = w.Delete(ctx, dk) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } return rowsDeleted, nil } @@ -140,7 +140,7 @@ func (r *Repository) ListRootKeys(ctx context.Context, opt ...Option) ([]*RootKe var keys []*RootKey err := r.list(ctx, &keys, "1=1", nil, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return keys, nil } diff --git a/internal/kms/repository_root_key_version.go b/internal/kms/repository_root_key_version.go index 701f6dfa5..6eae17164 100644 --- a/internal/kms/repository_root_key_version.go +++ b/internal/kms/repository_root_key_version.go @@ -14,24 +14,24 @@ import ( func (r *Repository) CreateRootKeyVersion(ctx context.Context, keyWrapper wrapping.Wrapper, rootKeyId string, key []byte, _ ...Option) (*RootKeyVersion, error) { const op = "kms.(Repository).CreateRootKeyVersion" if rootKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing root key id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key id") } if keyWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing key wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing key wrapper") } if len(key) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing key") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing key") } kv := AllocRootKeyVersion() id, err := newRootKeyVersionId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } kv.PrivateId = id kv.RootKeyId = rootKeyId kv.Key = key if err := kv.Encrypt(ctx, keyWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } var returnedKey interface{} @@ -43,13 +43,13 @@ func (r *Repository) CreateRootKeyVersion(ctx context.Context, keyWrapper wrappi returnedKey = kv.Clone() // no oplog entries for root key version if err := w.Create(ctx, returnedKey); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s root key id", kv.RootKeyId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s root key id", kv.RootKeyId))) } return returnedKey.(*RootKeyVersion), nil } @@ -59,18 +59,18 @@ func (r *Repository) CreateRootKeyVersion(ctx context.Context, keyWrapper wrappi func (r *Repository) LookupRootKeyVersion(ctx context.Context, keyWrapper wrapping.Wrapper, privateId string, _ ...Option) (*RootKeyVersion, error) { const op = "kms.(Repository).LookupRootKeyVersion" if privateId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing private id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } if keyWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing key wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing key wrapper") } k := AllocRootKeyVersion() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } if err := k.Decrypt(ctx, keyWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return &k, nil } @@ -81,12 +81,12 @@ func (r *Repository) LookupRootKeyVersion(ctx context.Context, keyWrapper wrappi func (r *Repository) DeleteRootKeyVersion(ctx context.Context, privateId string, _ ...Option) (int, error) { const op = "kms.(Repository).DeleteRootKeyVersion" if privateId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing private id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } k := AllocRootKeyVersion() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } var rowsDeleted int @@ -99,16 +99,16 @@ func (r *Repository) DeleteRootKeyVersion(ctx context.Context, privateId string, // no oplog entries for root key version rowsDeleted, err = w.Delete(ctx, dk) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } return rowsDeleted, nil } @@ -119,20 +119,20 @@ func (r *Repository) DeleteRootKeyVersion(ctx context.Context, privateId string, func (r *Repository) LatestRootKeyVersion(ctx context.Context, keyWrapper wrapping.Wrapper, rootKeyId string, _ ...Option) (*RootKeyVersion, error) { const op = "kms.(Repository).LatestRootKeyVersion" if rootKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing root key id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key id") } if keyWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing key wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing key wrapper") } var foundKeys []RootKeyVersion if err := r.reader.SearchWhere(ctx, &foundKeys, "root_key_id = ?", []interface{}{rootKeyId}, db.WithLimit(1), db.WithOrder("version desc")); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", rootKeyId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", rootKeyId))) } if len(foundKeys) == 0 { - return nil, errors.E(errors.WithCode(errors.RecordNotFound), errors.WithOp(op)) + return nil, errors.E(ctx, errors.WithCode(errors.RecordNotFound), errors.WithOp(op)) } if err := foundKeys[0].Decrypt(ctx, keyWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return &foundKeys[0], nil } @@ -141,19 +141,19 @@ func (r *Repository) LatestRootKeyVersion(ctx context.Context, keyWrapper wrappi func (r *Repository) ListRootKeyVersions(ctx context.Context, keyWrapper wrapping.Wrapper, rootKeyId string, opt ...Option) ([]*RootKeyVersion, error) { const op = "kms.(Repository).ListRootKeyVersions" if rootKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing root key id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key id") } if keyWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing key wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing key wrapper") } var versions []*RootKeyVersion err := r.list(ctx, &versions, "root_key_id = ?", []interface{}{rootKeyId}, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } for i, k := range versions { if err := k.Decrypt(ctx, keyWrapper); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error decrypting key num %d", i))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error decrypting key num %d", i))) } } return versions, nil diff --git a/internal/kms/repository_session_key.go b/internal/kms/repository_session_key.go index bffa58992..044dc4684 100644 --- a/internal/kms/repository_session_key.go +++ b/internal/kms/repository_session_key.go @@ -22,13 +22,13 @@ func (r *Repository) CreateSessionKey(ctx context.Context, rkvWrapper wrapping.W func(reader db.Reader, w db.Writer) error { var err error if returnedDk, returnedDv, err = createSessionKeyTx(ctx, reader, w, rkvWrapper, key); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } return returnedDk.(*SessionKey), returnedDv.(*SessionKeyVersion), nil } @@ -39,53 +39,53 @@ func (r *Repository) CreateSessionKey(ctx context.Context, rkvWrapper wrapping.W func createSessionKeyTx(ctx context.Context, r db.Reader, w db.Writer, rkvWrapper wrapping.Wrapper, key []byte) (*SessionKey, *SessionKeyVersion, error) { const op = "kms.createSessionKeyTx" if rkvWrapper == nil { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing key wrapper") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing key wrapper") } if len(key) == 0 { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing key") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing key") } rootKeyVersionId := rkvWrapper.KeyID() switch { case !strings.HasPrefix(rootKeyVersionId, RootKeyVersionPrefix): - return nil, nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) case rootKeyVersionId == "": - return nil, nil, errors.New(errors.InvalidParameter, op, "missing root key version id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version id") } rv := AllocRootKeyVersion() rv.PrivateId = rootKeyVersionId err := r.LookupById(ctx, &rv) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to lookup root key version %s", rootKeyVersionId))) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to lookup root key version %s", rootKeyVersionId))) } tk := AllocSessionKey() tv := AllocSessionKeyVersion() id, err := newSessionKeyId() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } tk.PrivateId = id tk.RootKeyId = rv.RootKeyId id, err = newSessionKeyVersionId() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } tv.PrivateId = id tv.SessionKeyId = tk.PrivateId tv.RootKeyVersionId = rootKeyVersionId tv.Key = key if err := tv.Encrypt(ctx, rkvWrapper); err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } // no session entries for keys if err := w.Create(ctx, &tk); err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("keys create")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("keys create")) } // no session entries for key versions if err := w.Create(ctx, &tv); err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("key versions create")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("key versions create")) } return &tk, &tv, nil @@ -96,12 +96,12 @@ func createSessionKeyTx(ctx context.Context, r db.Reader, w db.Writer, rkvWrappe func (r *Repository) LookupSessionKey(ctx context.Context, privateId string, _ ...Option) (*SessionKey, error) { const op = "kms.(Repository).LookupSessionKey" if privateId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing private id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } k := AllocSessionKey() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } return &k, nil } @@ -112,12 +112,12 @@ func (r *Repository) LookupSessionKey(ctx context.Context, privateId string, _ . func (r *Repository) DeleteSessionKey(ctx context.Context, privateId string, _ ...Option) (int, error) { const op = "kms.(Repository).DeleteSessionKey" if privateId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing private id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } k := AllocSessionKey() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } var rowsDeleted int @@ -130,16 +130,16 @@ func (r *Repository) DeleteSessionKey(ctx context.Context, privateId string, _ . // no session entries for root keys rowsDeleted, err = w.Delete(ctx, dk) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } return rowsDeleted, nil } @@ -150,7 +150,7 @@ func (r *Repository) ListSessionKeys(ctx context.Context, opt ...Option) ([]Dek, var keys []*SessionKey err := r.list(ctx, &keys, "1=1", nil, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } deks := make([]Dek, 0, len(keys)) for _, key := range keys { diff --git a/internal/kms/repository_session_key_version.go b/internal/kms/repository_session_key_version.go index 663464be9..d0f5044a3 100644 --- a/internal/kms/repository_session_key_version.go +++ b/internal/kms/repository_session_key_version.go @@ -15,32 +15,32 @@ import ( func (r *Repository) CreateSessionKeyVersion(ctx context.Context, rkvWrapper wrapping.Wrapper, sessionKeyId string, key []byte, _ ...Option) (*SessionKeyVersion, error) { const op = "kms.(Repository).CreateSessionKeyVersion" if rkvWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version wrapper") } rootKeyVersionId := rkvWrapper.KeyID() switch { case !strings.HasPrefix(rootKeyVersionId, RootKeyVersionPrefix): - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) case rootKeyVersionId == "": - return nil, errors.New(errors.InvalidParameter, op, "missing root key version id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version id") } if sessionKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing session key id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing session key id") } if len(key) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing key") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing key") } kv := AllocSessionKeyVersion() id, err := newSessionKeyVersionId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } kv.PrivateId = id kv.RootKeyVersionId = rootKeyVersionId kv.Key = key kv.SessionKeyId = sessionKeyId if err := kv.Encrypt(ctx, rkvWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } var returnedKey interface{} @@ -52,13 +52,13 @@ func (r *Repository) CreateSessionKeyVersion(ctx context.Context, rkvWrapper wra returnedKey = kv.Clone() // no session entries for root key version if err := w.Create(ctx, returnedKey); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s session key id", kv.SessionKeyId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s session key id", kv.SessionKeyId))) } return returnedKey.(*SessionKeyVersion), nil } @@ -68,18 +68,18 @@ func (r *Repository) CreateSessionKeyVersion(ctx context.Context, rkvWrapper wra func (r *Repository) LookupSessionKeyVersion(ctx context.Context, keyWrapper wrapping.Wrapper, privateId string, _ ...Option) (*SessionKeyVersion, error) { const op = "kms.(Repository).LookupSessionKeyVersion" if privateId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing private id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } if keyWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing key wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing key wrapper") } k := AllocSessionKeyVersion() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } if err := k.Decrypt(ctx, keyWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return &k, nil } @@ -90,12 +90,12 @@ func (r *Repository) LookupSessionKeyVersion(ctx context.Context, keyWrapper wra func (r *Repository) DeleteSessionKeyVersion(ctx context.Context, privateId string, _ ...Option) (int, error) { const op = "kms.(Repository).DeleteSessionKeyVersion" if privateId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing private id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } k := AllocSessionKeyVersion() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } var rowsDeleted int @@ -108,16 +108,16 @@ func (r *Repository) DeleteSessionKeyVersion(ctx context.Context, privateId stri // no session entries for the key version rowsDeleted, err = w.Delete(ctx, dk) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } return rowsDeleted, nil } @@ -128,20 +128,20 @@ func (r *Repository) DeleteSessionKeyVersion(ctx context.Context, privateId stri func (r *Repository) LatestSessionKeyVersion(ctx context.Context, rkvWrapper wrapping.Wrapper, sessionKeyId string, _ ...Option) (*SessionKeyVersion, error) { const op = "kms.(Repository).LatestSessionKeyVersion" if sessionKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing session key id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing session key id") } if rkvWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version wrapper") } var foundKeys []*SessionKeyVersion if err := r.reader.SearchWhere(ctx, &foundKeys, "session_key_id = ?", []interface{}{sessionKeyId}, db.WithLimit(1), db.WithOrder("version desc")); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", sessionKeyId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", sessionKeyId))) } if len(foundKeys) == 0 { - return nil, errors.E(errors.WithCode(errors.RecordNotFound), errors.WithOp(op)) + return nil, errors.E(ctx, errors.WithCode(errors.RecordNotFound), errors.WithOp(op)) } if err := foundKeys[0].Decrypt(ctx, rkvWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return foundKeys[0], nil } @@ -150,19 +150,19 @@ func (r *Repository) LatestSessionKeyVersion(ctx context.Context, rkvWrapper wra func (r *Repository) ListSessionKeyVersions(ctx context.Context, rkvWrapper wrapping.Wrapper, sessionKeyId string, opt ...Option) ([]DekVersion, error) { const op = "kms.(Repository).ListSessionKeyVersions" if sessionKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing session key id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing session key id") } if rkvWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version wrapper") } var versions []*SessionKeyVersion err := r.list(ctx, &versions, "session_key_id = ?", []interface{}{sessionKeyId}, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } for i, k := range versions { if err := k.Decrypt(ctx, rkvWrapper); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error decrypting key num %d", i))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error decrypting key num %d", i))) } } dekVersions := make([]DekVersion, 0, len(versions)) diff --git a/internal/kms/repository_token_key.go b/internal/kms/repository_token_key.go index debd92065..a431b5243 100644 --- a/internal/kms/repository_token_key.go +++ b/internal/kms/repository_token_key.go @@ -22,13 +22,13 @@ func (r *Repository) CreateTokenKey(ctx context.Context, rkvWrapper wrapping.Wra func(reader db.Reader, w db.Writer) error { var err error if returnedDk, returnedDv, err = createTokenKeyTx(ctx, reader, w, rkvWrapper, key); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } return returnedDk.(*TokenKey), returnedDv.(*TokenKeyVersion), nil } @@ -39,53 +39,53 @@ func (r *Repository) CreateTokenKey(ctx context.Context, rkvWrapper wrapping.Wra func createTokenKeyTx(ctx context.Context, r db.Reader, w db.Writer, rkvWrapper wrapping.Wrapper, key []byte) (*TokenKey, *TokenKeyVersion, error) { const op = "kms.createTokenKeyTx" if rkvWrapper == nil { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing key wrapper") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing key wrapper") } if len(key) == 0 { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing key") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing key") } rootKeyVersionId := rkvWrapper.KeyID() switch { case !strings.HasPrefix(rootKeyVersionId, RootKeyVersionPrefix): - return nil, nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) case rootKeyVersionId == "": - return nil, nil, errors.New(errors.InvalidParameter, op, "missing root key version id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version id") } rv := AllocRootKeyVersion() rv.PrivateId = rootKeyVersionId err := r.LookupById(ctx, &rv) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to lookup root key version %s", rootKeyVersionId))) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to lookup root key version %s", rootKeyVersionId))) } tk := AllocTokenKey() tv := AllocTokenKeyVersion() id, err := newTokenKeyId() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } tk.PrivateId = id tk.RootKeyId = rv.RootKeyId id, err = newTokenKeyVersionId() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } tv.PrivateId = id tv.TokenKeyId = tk.PrivateId tv.RootKeyVersionId = rootKeyVersionId tv.Key = key if err := tv.Encrypt(ctx, rkvWrapper); err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } // no token entries for keys if err := w.Create(ctx, &tk); err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("keys create")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("keys create")) } // no token entries for key versions if err := w.Create(ctx, &tv); err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("key versions create")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("key versions create")) } return &tk, &tv, nil @@ -96,12 +96,12 @@ func createTokenKeyTx(ctx context.Context, r db.Reader, w db.Writer, rkvWrapper func (r *Repository) LookupTokenKey(ctx context.Context, privateId string, _ ...Option) (*TokenKey, error) { const op = "kms.(Repository).LookupTokenKey" if privateId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing private id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } k := AllocTokenKey() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } return &k, nil } @@ -112,12 +112,12 @@ func (r *Repository) LookupTokenKey(ctx context.Context, privateId string, _ ... func (r *Repository) DeleteTokenKey(ctx context.Context, privateId string, _ ...Option) (int, error) { const op = "kms.(Repository).DeleteTokenKey" if privateId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing private id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } k := AllocTokenKey() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } var rowsDeleted int @@ -130,16 +130,16 @@ func (r *Repository) DeleteTokenKey(ctx context.Context, privateId string, _ ... // no token entries for root keys rowsDeleted, err = w.Delete(ctx, dk) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } return rowsDeleted, nil } @@ -150,7 +150,7 @@ func (r *Repository) ListTokenKeys(ctx context.Context, opt ...Option) ([]Dek, e var keys []*TokenKey err := r.list(ctx, &keys, "1=1", nil, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } deks := make([]Dek, 0, len(keys)) for _, key := range keys { diff --git a/internal/kms/repository_token_key_version.go b/internal/kms/repository_token_key_version.go index c352d6ba1..3cbd103f1 100644 --- a/internal/kms/repository_token_key_version.go +++ b/internal/kms/repository_token_key_version.go @@ -15,32 +15,32 @@ import ( func (r *Repository) CreateTokenKeyVersion(ctx context.Context, rkvWrapper wrapping.Wrapper, tokenKeyId string, key []byte, _ ...Option) (*TokenKeyVersion, error) { const op = "kms.(Repository).CreateTokenKeyVersion" if rkvWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version wrapper") } rootKeyVersionId := rkvWrapper.KeyID() switch { case !strings.HasPrefix(rootKeyVersionId, RootKeyVersionPrefix): - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("root key version id %s doesn't start with prefix %s", rootKeyVersionId, RootKeyVersionPrefix)) case rootKeyVersionId == "": - return nil, errors.New(errors.InvalidParameter, op, "missing root key version id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version id") } if tokenKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing token key id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing token key id") } if len(key) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing key") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing key") } kv := AllocTokenKeyVersion() id, err := newTokenKeyVersionId() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } kv.PrivateId = id kv.RootKeyVersionId = rootKeyVersionId kv.Key = key kv.TokenKeyId = tokenKeyId if err := kv.Encrypt(ctx, rkvWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } var returnedKey interface{} @@ -52,13 +52,13 @@ func (r *Repository) CreateTokenKeyVersion(ctx context.Context, rkvWrapper wrapp returnedKey = kv.Clone() // no token entries for root key version if err := w.Create(ctx, returnedKey); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s token key id", kv.TokenKeyId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s token key id", kv.TokenKeyId))) } return returnedKey.(*TokenKeyVersion), nil } @@ -68,18 +68,18 @@ func (r *Repository) CreateTokenKeyVersion(ctx context.Context, rkvWrapper wrapp func (r *Repository) LookupTokenKeyVersion(ctx context.Context, keyWrapper wrapping.Wrapper, privateId string, _ ...Option) (*TokenKeyVersion, error) { const op = "kms.(Repository).LookupTokenKeyVersion" if privateId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing private id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } if keyWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing key wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing key wrapper") } k := AllocTokenKeyVersion() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } if err := k.Decrypt(ctx, keyWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return &k, nil } @@ -90,12 +90,12 @@ func (r *Repository) LookupTokenKeyVersion(ctx context.Context, keyWrapper wrapp func (r *Repository) DeleteTokenKeyVersion(ctx context.Context, privateId string, _ ...Option) (int, error) { const op = "kms.(Repository).DeleteTokenKeyVersion" if privateId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing private id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing private id") } k := AllocTokenKeyVersion() k.PrivateId = privateId if err := r.reader.LookupById(ctx, &k); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } var rowsDeleted int @@ -108,16 +108,16 @@ func (r *Repository) DeleteTokenKeyVersion(ctx context.Context, privateId string // no token entries for the key version rowsDeleted, err = w.Delete(ctx, dk) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", privateId))) } return rowsDeleted, nil } @@ -128,20 +128,20 @@ func (r *Repository) DeleteTokenKeyVersion(ctx context.Context, privateId string func (r *Repository) LatestTokenKeyVersion(ctx context.Context, rkvWrapper wrapping.Wrapper, tokenKeyId string, _ ...Option) (*TokenKeyVersion, error) { const op = "kms.(Repository).LatestTokenKeyVersion" if tokenKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing token key id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing token key id") } if rkvWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version wrapper") } var foundKeys []*TokenKeyVersion if err := r.reader.SearchWhere(ctx, &foundKeys, "token_key_id = ?", []interface{}{tokenKeyId}, db.WithLimit(1), db.WithOrder("version desc")); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", tokenKeyId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", tokenKeyId))) } if len(foundKeys) == 0 { - return nil, errors.E(errors.WithCode(errors.RecordNotFound), errors.WithOp(op)) + return nil, errors.E(ctx, errors.WithCode(errors.RecordNotFound), errors.WithOp(op)) } if err := foundKeys[0].Decrypt(ctx, rkvWrapper); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return foundKeys[0], nil } @@ -150,19 +150,19 @@ func (r *Repository) LatestTokenKeyVersion(ctx context.Context, rkvWrapper wrapp func (r *Repository) ListTokenKeyVersions(ctx context.Context, rkvWrapper wrapping.Wrapper, tokenKeyId string, opt ...Option) ([]DekVersion, error) { const op = "kms.(Repository).ListTokenKeyVersions" if tokenKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing token key id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing token key id") } if rkvWrapper == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing root key version wrapper") } var versions []*TokenKeyVersion err := r.list(ctx, &versions, "token_key_id = ?", []interface{}{tokenKeyId}, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } for i, k := range versions { if err := k.Decrypt(ctx, rkvWrapper); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error decrypting key num %d", i))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("error decrypting key num %d", i))) } } dekVersions := make([]DekVersion, 0, len(versions)) diff --git a/internal/kms/root_key.go b/internal/kms/root_key.go index 0e0fab25d..f98049487 100644 --- a/internal/kms/root_key.go +++ b/internal/kms/root_key.go @@ -25,7 +25,7 @@ type RootKey struct { func NewRootKey(scopeId string, _ ...Option) (*RootKey, error) { const op = "kms.NewRootKey" if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing scope id") } c := &RootKey{ RootKey: &store.RootKey{ @@ -52,18 +52,18 @@ func (k *RootKey) Clone() interface{} { // VetForWrite implements db.VetForWrite() interface and validates the key // before it's written. -func (k *RootKey) VetForWrite(_ context.Context, _ db.Reader, opType db.OpType, _ ...db.Option) error { +func (k *RootKey) VetForWrite(ctx context.Context, _ db.Reader, opType db.OpType, _ ...db.Option) error { const op = "kms.(RootKey).VetForWrite" if k.PrivateId == "" { - return errors.New(errors.InvalidParameter, op, "missing private id") + return errors.New(ctx, errors.InvalidParameter, op, "missing private id") } switch opType { case db.CreateOp: if k.ScopeId == "" { - return errors.New(errors.InvalidParameter, op, "missing scope id") + return errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } case db.UpdateOp: - return errors.New(errors.InvalidParameter, op, "key is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "key is immutable") } return nil } diff --git a/internal/kms/root_key_version.go b/internal/kms/root_key_version.go index e070dde1b..cb2827317 100644 --- a/internal/kms/root_key_version.go +++ b/internal/kms/root_key_version.go @@ -25,10 +25,10 @@ type RootKeyVersion struct { func NewRootKeyVersion(rootKeyId string, key []byte, _ ...Option) (*RootKeyVersion, error) { const op = "kms.NewRootKeyVersion" if rootKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing root key id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing root key id") } if len(key) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing key") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing key") } k := &RootKeyVersion{ @@ -57,21 +57,21 @@ func (k *RootKeyVersion) Clone() interface{} { // VetForWrite implements db.VetForWrite() interface and validates the root key // version before it's written. -func (k *RootKeyVersion) VetForWrite(_ context.Context, _ db.Reader, opType db.OpType, _ ...db.Option) error { +func (k *RootKeyVersion) VetForWrite(ctx context.Context, _ db.Reader, opType db.OpType, _ ...db.Option) error { const op = "kms.(RootKeyVersion).VetForWrite" if k.PrivateId == "" { - return errors.New(errors.InvalidParameter, op, "missing private id") + return errors.New(ctx, errors.InvalidParameter, op, "missing private id") } switch opType { case db.CreateOp: if k.CtKey == nil { - return errors.New(errors.InvalidParameter, op, "missing key") + return errors.New(ctx, errors.InvalidParameter, op, "missing key") } if k.RootKeyId == "" { - return errors.New(errors.InvalidParameter, op, "missing root key id") + return errors.New(ctx, errors.InvalidParameter, op, "missing root key id") } case db.UpdateOp: - return errors.New(errors.InvalidParameter, op, "key is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "key is immutable") } return nil } @@ -97,7 +97,7 @@ func (k *RootKeyVersion) Encrypt(ctx context.Context, cipher wrapping.Wrapper) e // structwrapping doesn't support embedding, so we'll pass in the // store.RootKey directly if err := structwrapping.WrapStruct(ctx, cipher, k.RootKeyVersion, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Encrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt)) } return nil } @@ -108,7 +108,7 @@ func (k *RootKeyVersion) Decrypt(ctx context.Context, cipher wrapping.Wrapper) e // structwrapping doesn't support embedding, so we'll pass in the // store.RootKeyVersion directly if err := structwrapping.UnwrapStruct(ctx, cipher, k.RootKeyVersion, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Decrypt)) } return nil } diff --git a/internal/kms/session_key.go b/internal/kms/session_key.go index b8c8ab033..21105afe2 100644 --- a/internal/kms/session_key.go +++ b/internal/kms/session_key.go @@ -23,7 +23,7 @@ type SessionKey struct { func NewSessionKey(rootKeyId string, _ ...Option) (*SessionKey, error) { const op = "kms.NewSessionKey" if rootKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing root key id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing root key id") } c := &SessionKey{ SessionKey: &store.SessionKey{ @@ -50,14 +50,14 @@ func (k *SessionKey) Clone() interface{} { // VetForWrite implements db.VetForWrite() interface and validates the key // before it's written. -func (k *SessionKey) VetForWrite(_ context.Context, _ db.Reader, opType db.OpType, _ ...db.Option) error { +func (k *SessionKey) VetForWrite(ctx context.Context, _ db.Reader, opType db.OpType, _ ...db.Option) error { const op = "kms.(SessionKey).VetForWrite" if k.PrivateId == "" { - return errors.New(errors.InvalidParameter, op, "missing private id") + return errors.New(ctx, errors.InvalidParameter, op, "missing private id") } if opType == db.CreateOp { if k.RootKeyId == "" { - return errors.New(errors.InvalidParameter, op, "missing root key id") + return errors.New(ctx, errors.InvalidParameter, op, "missing root key id") } } return nil diff --git a/internal/kms/session_key_version.go b/internal/kms/session_key_version.go index b5ef871f3..631d2ee75 100644 --- a/internal/kms/session_key_version.go +++ b/internal/kms/session_key_version.go @@ -25,13 +25,13 @@ type SessionKeyVersion struct { func NewSessionKeyVersion(sessionKeyId string, key []byte, rootKeyVersionId string, _ ...Option) (*SessionKeyVersion, error) { const op = "kms.NewSessionKeyVersion" if sessionKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing session key id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing session key id") } if len(key) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing key") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing key") } if rootKeyVersionId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing root key version id") } k := &SessionKeyVersion{ @@ -64,17 +64,17 @@ func (k *SessionKeyVersion) Clone() interface{} { func (k *SessionKeyVersion) VetForWrite(ctx context.Context, r db.Reader, opType db.OpType, opt ...db.Option) error { const op = "kms.(SessionKeyVersion).VetForWrite" if k.PrivateId == "" { - return errors.New(errors.InvalidParameter, op, "missing private id") + return errors.New(ctx, errors.InvalidParameter, op, "missing private id") } if opType == db.CreateOp { if k.CtKey == nil { - return errors.New(errors.InvalidParameter, op, "missing key") + return errors.New(ctx, errors.InvalidParameter, op, "missing key") } if k.SessionKeyId == "" { - return errors.New(errors.InvalidParameter, op, "missing session key id") + return errors.New(ctx, errors.InvalidParameter, op, "missing session key id") } if k.RootKeyVersionId == "" { - return errors.New(errors.InvalidParameter, op, "missing root key version id") + return errors.New(ctx, errors.InvalidParameter, op, "missing root key version id") } } return nil @@ -101,7 +101,7 @@ func (k *SessionKeyVersion) Encrypt(ctx context.Context, cipher wrapping.Wrapper // structwrapping doesn't support embedding, so we'll pass in the // store.SessionKeyVersion directly if err := structwrapping.WrapStruct(ctx, cipher, k.SessionKeyVersion, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Encrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt)) } return nil } @@ -112,7 +112,7 @@ func (k *SessionKeyVersion) Decrypt(ctx context.Context, cipher wrapping.Wrapper // structwrapping doesn't support embedding, so we'll pass in the // store.SessionKeyVersion directly if err := structwrapping.UnwrapStruct(ctx, cipher, k.SessionKeyVersion, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Decrypt)) } return nil } diff --git a/internal/kms/token_key.go b/internal/kms/token_key.go index 64c1d77b6..63e61d63a 100644 --- a/internal/kms/token_key.go +++ b/internal/kms/token_key.go @@ -23,7 +23,7 @@ type TokenKey struct { func NewTokenKey(rootKeyId string, _ ...Option) (*TokenKey, error) { const op = "kms.NewTokenKey" if rootKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing root key id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing root key id") } c := &TokenKey{ TokenKey: &store.TokenKey{ @@ -50,14 +50,14 @@ func (k *TokenKey) Clone() interface{} { // VetForWrite implements db.VetForWrite() interface and validates the key // before it's written. -func (k *TokenKey) VetForWrite(_ context.Context, _ db.Reader, opType db.OpType, _ ...db.Option) error { +func (k *TokenKey) VetForWrite(ctx context.Context, _ db.Reader, opType db.OpType, _ ...db.Option) error { const op = "kms.(TokenKey).VetForWrite" if k.PrivateId == "" { - return errors.New(errors.InvalidParameter, op, "missing private id") + return errors.New(ctx, errors.InvalidParameter, op, "missing private id") } if opType == db.CreateOp { if k.RootKeyId == "" { - return errors.New(errors.InvalidParameter, op, "missing root key id") + return errors.New(ctx, errors.InvalidParameter, op, "missing root key id") } } return nil diff --git a/internal/kms/token_key_version.go b/internal/kms/token_key_version.go index 17da69876..0766105e0 100644 --- a/internal/kms/token_key_version.go +++ b/internal/kms/token_key_version.go @@ -25,13 +25,13 @@ type TokenKeyVersion struct { func NewTokenKeyVersion(tokenKeyId string, key []byte, rootKeyVersionId string, _ ...Option) (*TokenKeyVersion, error) { const op = "kms.NewTokenKeyVersion" if tokenKeyId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing token key id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing token key id") } if len(key) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing key") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing key") } if rootKeyVersionId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing root key version id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing root key version id") } k := &TokenKeyVersion{ @@ -61,20 +61,20 @@ func (k *TokenKeyVersion) Clone() interface{} { // VetForWrite implements db.VetForWrite() interface and validates the key // version before it's written. -func (k *TokenKeyVersion) VetForWrite(_ context.Context, _r db.Reader, opType db.OpType, _ ...db.Option) error { +func (k *TokenKeyVersion) VetForWrite(ctx context.Context, _r db.Reader, opType db.OpType, _ ...db.Option) error { const op = "kms.(TokenKeyVersion).VetForWrite" if k.PrivateId == "" { - return errors.New(errors.InvalidParameter, op, "missing private id") + return errors.New(ctx, errors.InvalidParameter, op, "missing private id") } if opType == db.CreateOp { if k.CtKey == nil { - return errors.New(errors.InvalidParameter, op, "missing key") + return errors.New(ctx, errors.InvalidParameter, op, "missing key") } if k.TokenKeyId == "" { - return errors.New(errors.InvalidParameter, op, "missing token key id") + return errors.New(ctx, errors.InvalidParameter, op, "missing token key id") } if k.RootKeyVersionId == "" { - return errors.New(errors.InvalidParameter, op, "missing root key version id") + return errors.New(ctx, errors.InvalidParameter, op, "missing root key version id") } } return nil @@ -101,7 +101,7 @@ func (k *TokenKeyVersion) Encrypt(ctx context.Context, cipher wrapping.Wrapper) // structwrapping doesn't support embedding, so we'll pass in the // store.TokenKeyVersion directly if err := structwrapping.WrapStruct(ctx, cipher, k.TokenKeyVersion, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Encrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt)) } return nil } @@ -112,7 +112,7 @@ func (k *TokenKeyVersion) Decrypt(ctx context.Context, cipher wrapping.Wrapper) // structwrapping doesn't support embedding, so we'll pass in the // store.TokenKeyVersion directly if err := structwrapping.UnwrapStruct(ctx, cipher, k.TokenKeyVersion, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Decrypt)) } return nil } diff --git a/internal/observability/event/context.go b/internal/observability/event/context.go index 439488c4f..659404880 100644 --- a/internal/observability/event/context.go +++ b/internal/observability/event/context.go @@ -318,6 +318,8 @@ func newSendCtx(ctx context.Context) (context.Context, context.CancelFunc) { var sendCtx context.Context var sendCancel context.CancelFunc switch { + case ctx == nil: + return context.Background(), nil case ctx.Err() == context.Canceled: sendCtx, sendCancel = context.WithTimeout(context.Background(), cancelledSendTimeout) info, ok := RequestInfoFromContext(ctx) diff --git a/internal/observability/event/serialized_writer.go b/internal/observability/event/serialized_writer.go index 54a8e7b9d..4935ed76a 100644 --- a/internal/observability/event/serialized_writer.go +++ b/internal/observability/event/serialized_writer.go @@ -2,10 +2,9 @@ package event import ( "bytes" + "fmt" "io" "sync" - - "github.com/hashicorp/boundary/internal/errors" ) // serializedWriter uses a mutext to serializes all writes to its io.Writer @@ -18,13 +17,13 @@ type serializedWriter struct { func (s *serializedWriter) Write(p []byte) (int, error) { const op = "event.(serializedWriter).Write" if s == nil { - return 0, errors.New(errors.InvalidParameter, op, "missing serialized writer") + return 0, fmt.Errorf("%s: missing serialized writer: %w", op, ErrInvalidParameter) } if s.l == nil { - return 0, errors.New(errors.InvalidParameter, op, "missing lock") + return 0, fmt.Errorf("%s: missing lock: %w", op, ErrInvalidParameter) } if s.w == nil { - return 0, errors.New(errors.InvalidParameter, op, "missing writer") + return 0, fmt.Errorf("%s: missing writer: %w", op, ErrInvalidParameter) } s.l.Lock() diff --git a/internal/observability/event/serialized_writer_test.go b/internal/observability/event/serialized_writer_test.go index 094e4e3f1..66a073b6f 100644 --- a/internal/observability/event/serialized_writer_test.go +++ b/internal/observability/event/serialized_writer_test.go @@ -1,32 +1,35 @@ package event import ( + "errors" + "fmt" "os" "sync" "testing" - "github.com/hashicorp/boundary/internal/errors" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) +var errTestWriteFailed = errors.New("bad write") + type testBadWriter struct{} func (b *testBadWriter) Write(p []byte) (int, error) { const op = "event.(testBadWriter).Write" - return 0, errors.New(errors.Internal, op, "write failed") + return 0, fmt.Errorf("%s: write failed: %w", op, errTestWriteFailed) } func TestSerializedWriter_Write(t *testing.T) { tests := []struct { name string s *serializedWriter - wantErrMatch *errors.Template + wantErrIs error wantErrContains string }{ { name: "missing-serializedWriter", - wantErrMatch: errors.T(errors.InvalidParameter), + wantErrIs: ErrInvalidParameter, wantErrContains: "missing serialized writer", }, { @@ -34,7 +37,7 @@ func TestSerializedWriter_Write(t *testing.T) { s: &serializedWriter{ l: new(sync.Mutex), }, - wantErrMatch: errors.T(errors.InvalidParameter), + wantErrIs: ErrInvalidParameter, wantErrContains: "missing writer", }, { @@ -42,7 +45,7 @@ func TestSerializedWriter_Write(t *testing.T) { s: &serializedWriter{ w: os.Stderr, }, - wantErrMatch: errors.T(errors.InvalidParameter), + wantErrIs: ErrInvalidParameter, wantErrContains: "missing lock", }, { @@ -51,7 +54,7 @@ func TestSerializedWriter_Write(t *testing.T) { w: &testBadWriter{}, l: new(sync.Mutex), }, - wantErrMatch: errors.T(errors.Internal), + wantErrIs: errTestWriteFailed, wantErrContains: "write failed", }, } @@ -60,10 +63,10 @@ func TestSerializedWriter_Write(t *testing.T) { assert, require := assert.New(t), require.New(t) n, err := tt.s.Write([]byte("fido")) - if tt.wantErrMatch != nil { + if tt.wantErrIs != nil { require.Error(err) require.Empty(n) - assert.Truef(errors.Match(tt.wantErrMatch, err), "got %q and wanted %q", tt.wantErrMatch.Code, err) + assert.ErrorIs(err, tt.wantErrIs) if tt.wantErrContains != "" { assert.Contains(err.Error(), tt.wantErrContains) } diff --git a/internal/oplog/oplog.go b/internal/oplog/oplog.go index 60bd6d838..2236d5820 100644 --- a/internal/oplog/oplog.go +++ b/internal/oplog/oplog.go @@ -62,7 +62,7 @@ func NewEntry(aggregateName string, metadata Metadata, cipherer wrapping.Wrapper entry.Metadata = storeMD } if err := entry.validate(); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.WrapDeprecated(err, op) } return &entry, nil } @@ -70,19 +70,19 @@ func NewEntry(aggregateName string, metadata Metadata, cipherer wrapping.Wrapper func (e *Entry) validate() error { const op = "oplog.(Entry).validate" if e.Cipherer == nil { - return errors.New(errors.InvalidParameter, op, "nil cipherer") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil cipherer") } if e.Ticketer == nil { - return errors.New(errors.InvalidParameter, op, "nil ticketer") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil ticketer") } if e.Entry == nil { - return errors.New(errors.InvalidParameter, op, "nil entry") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil entry") } if e.Entry.Version == "" { - return errors.New(errors.InvalidParameter, op, "missing entry version") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing entry version") } if e.Entry.AggregateName == "" { - return errors.New(errors.InvalidParameter, op, "missing entry aggregate name") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing entry aggregate name") } return nil } @@ -91,10 +91,10 @@ func (e *Entry) validate() error { func (e *Entry) UnmarshalData(types *TypeCatalog) ([]Message, error) { const op = "oplog.(Entry).UnmarshalData" if types == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil type catalog") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil type catalog") } if len(e.Data) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing data") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing data") } msgs := []Message{} queue := Queue{ @@ -107,11 +107,11 @@ func (e *Entry) UnmarshalData(types *TypeCatalog) ([]Message, error) { break } if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("error removing item from queue")) + return nil, errors.WrapDeprecated(err, op, errors.WithMsg("error removing item from queue")) } name, err := types.GetTypeName(m) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.WrapDeprecated(err, op) } msgs = append(msgs, Message{Message: m, TypeName: name, OpType: typ, FieldMaskPaths: fieldMaskPaths, SetToNullPaths: nullPaths}) } @@ -123,38 +123,38 @@ func (e *Entry) UnmarshalData(types *TypeCatalog) ([]Message, error) { func (e *Entry) WriteEntryWith(ctx context.Context, tx Writer, ticket *store.Ticket, msgs ...*Message) error { const op = "oplog.(Entry).WriteEntryWith" if tx == nil { - return errors.New(errors.InvalidParameter, op, "nil writer") + return errors.New(ctx, errors.InvalidParameter, op, "nil writer") } if err := e.validate(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if ticket == nil { - return errors.New(errors.InvalidParameter, op, "nil ticket") + return errors.New(ctx, errors.InvalidParameter, op, "nil ticket") } if ticket.Version == 0 { - return errors.New(errors.InvalidParameter, op, "missing ticket version") + return errors.New(ctx, errors.InvalidParameter, op, "missing ticket version") } queue := Queue{} for _, m := range msgs { if m == nil { - return errors.New(errors.InvalidParameter, op, "nil message") + return errors.New(ctx, errors.InvalidParameter, op, "nil message") } if err := queue.Add(m.Message, m.TypeName, m.OpType, WithFieldMaskPaths(m.FieldMaskPaths), WithSetToNullPaths(m.SetToNullPaths)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("error adding message to queue")) + return errors.Wrap(ctx, err, op, errors.WithMsg("error adding message to queue")) } } e.Data = append(e.Data, queue.Bytes()...) if e.Cipherer != nil { if err := e.EncryptData(ctx); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } } if err := tx.Create(e); err != nil { - return errors.Wrap(err, op, errors.WithMsg("error writing data to storage")) + return errors.Wrap(ctx, err, op, errors.WithMsg("error writing data to storage")) } if err := e.Ticketer.Redeem(ticket); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -164,24 +164,24 @@ func (e *Entry) WriteEntryWith(ctx context.Context, tx Writer, ticket *store.Tic func (e *Entry) Write(ctx context.Context, tx Writer, ticket *store.Ticket) error { const op = "oplog.(Entry).Write" if err := e.validate(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if ticket == nil { - return errors.New(errors.InvalidParameter, op, "nil ticket") + return errors.New(ctx, errors.InvalidParameter, op, "nil ticket") } if ticket.Version == 0 { - return errors.New(errors.InvalidParameter, op, "missing ticket version") + return errors.New(ctx, errors.InvalidParameter, op, "missing ticket version") } if e.Cipherer != nil { if err := e.EncryptData(ctx); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } } if err := tx.Create(e); err != nil { - return errors.Wrap(err, op, errors.WithMsg("error writing data to storage")) + return errors.Wrap(ctx, err, op, errors.WithMsg("error writing data to storage")) } if err := e.Ticketer.Redeem(ticket); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -191,7 +191,7 @@ func (e *Entry) EncryptData(ctx context.Context) error { const op = "oplog.(Entry).EncryptData" // structwrapping doesn't support embedding, so we'll pass in the store.Entry directly if err := structwrapping.WrapStruct(ctx, e.Cipherer, e.Entry, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Encrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt)) } return nil } @@ -201,23 +201,23 @@ func (e *Entry) DecryptData(ctx context.Context) error { const op = "oplog.(Entry).DecryptData" // structwrapping doesn't support embedding, so we'll pass in the store.Entry directly if err := structwrapping.UnwrapStruct(ctx, e.Cipherer, e.Entry, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Decrypt)) } return nil } // Replay provides the ability to replay an entry. you must initialize any new tables ending with the tableSuffix before // calling Replay, otherwise you'll get "a table doesn't exist" error. -func (e *Entry) Replay(_ context.Context, tx Writer, types *TypeCatalog, tableSuffix string) error { +func (e *Entry) Replay(ctx context.Context, tx Writer, types *TypeCatalog, tableSuffix string) error { const op = "oplog.(Entry).Replay" msgs, err := e.UnmarshalData(types) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } for _, m := range msgs { em, ok := m.Message.(ReplayableMessage) if !ok { - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("%T is not a replayable message", m.Message)) + return errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%T is not a replayable message", m.Message)) } origTableName := em.TableName() defer em.SetTableName(origTableName) @@ -236,7 +236,7 @@ func (e *Entry) Replay(_ context.Context, tx Writer, types *TypeCatalog, tableSu replayTable := origTableName + tableSuffix if !tx.hasTable(replayTable) { if err := tx.createTableLike(origTableName, replayTable); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } } @@ -244,18 +244,18 @@ func (e *Entry) Replay(_ context.Context, tx Writer, types *TypeCatalog, tableSu switch m.OpType { case OpType_OP_TYPE_CREATE: if err := tx.Create(m.Message); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } case OpType_OP_TYPE_UPDATE: if err := tx.Update(m.Message, m.FieldMaskPaths, m.SetToNullPaths); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } case OpType_OP_TYPE_DELETE: if err := tx.Delete(m.Message); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } default: - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("invalid operation %T", m.OpType)) + return errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("invalid operation %T", m.OpType)) } } return nil diff --git a/internal/oplog/queue.go b/internal/oplog/queue.go index 0ac7fb3d5..10155a8ab 100644 --- a/internal/oplog/queue.go +++ b/internal/oplog/queue.go @@ -38,15 +38,15 @@ func (q *Queue) Add(m proto.Message, typeName string, t OpType, opt ...Option) e withNullPaths := opts[optionWithSetToNullPaths].([]string) if _, ok := m.(ReplayableMessage); !ok { - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("%T is not a replayable message", m)) + return errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("%T is not a replayable message", m)) } value, err := proto.Marshal(m) if err != nil { - return errors.New(errors.Encode, op, "error marshaling add parameter", errors.WithWrap(err)) + return errors.NewDeprecated(errors.Encode, op, "error marshaling add parameter", errors.WithWrap(err)) } if t == OpType_OP_TYPE_UPDATE { if len(withFieldMasks) == 0 && len(withNullPaths) == 0 { - return errors.New(errors.InvalidParameter, op, "missing field masks or null paths for update") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing field masks or null paths for update") } fMasks := withFieldMasks if fMasks == nil { @@ -58,10 +58,10 @@ func (q *Queue) Add(m proto.Message, typeName string, t OpType, opt ...Option) e } i, _, _, err := common.Intersection(fMasks, nullPaths) if err != nil { - return errors.Wrap(err, op) + return errors.WrapDeprecated(err, op) } if len(i) != 0 { - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("field masks and null paths intersect with: %s", i)) + return errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("field masks and null paths intersect with: %s", i)) } } @@ -74,20 +74,20 @@ func (q *Queue) Add(m proto.Message, typeName string, t OpType, opt ...Option) e } data, err := proto.Marshal(msg) if err != nil { - return errors.New(errors.Encode, op, "error marshaling message", errors.WithWrap(err)) + return errors.NewDeprecated(errors.Encode, op, "error marshaling message", errors.WithWrap(err)) } q.mx.Lock() defer q.mx.Unlock() err = binary.Write(q, binary.LittleEndian, uint32(len(data))) if err != nil { - return errors.New(errors.Io, op, "binary write error", errors.WithWrap(err)) + return errors.NewDeprecated(errors.Io, op, "binary write error", errors.WithWrap(err)) } n, err := q.Write(data) if err != nil { - return errors.New(errors.Io, op, "error writing to queue buffer", errors.WithWrap(err)) + return errors.NewDeprecated(errors.Io, op, "error writing to queue buffer", errors.WithWrap(err)) } if n != len(data) { - return errors.New(errors.Io, op, fmt.Sprintf("error writing to queue buffer (incorrect number of bytes %d of %d)", n, len(data))) + return errors.NewDeprecated(errors.Io, op, fmt.Sprintf("error writing to queue buffer (incorrect number of bytes %d of %d)", n, len(data))) } return nil } @@ -98,7 +98,7 @@ func (q *Queue) Add(m proto.Message, typeName string, t OpType, opt ...Option) e func (q *Queue) Remove() (proto.Message, OpType, []string, []string, error) { const op = "oplog.(Queue).Remove" if q.Catalog == nil { - return nil, OpType_OP_TYPE_UNSPECIFIED, nil, nil, errors.New(errors.InvalidParameter, op, "nil catalog") + return nil, OpType_OP_TYPE_UNSPECIFIED, nil, nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil catalog") } q.mx.Lock() defer q.mx.Unlock() @@ -108,24 +108,24 @@ func (q *Queue) Remove() (proto.Message, OpType, []string, []string, error) { return nil, 0, nil, nil, err // intentionally not wrapping error, return io.EOF so client can handle it correctly } if err != nil { - return nil, 0, nil, nil, errors.New(errors.Io, op, "binary read error", errors.WithWrap(err)) + return nil, 0, nil, nil, errors.NewDeprecated(errors.Io, op, "binary read error", errors.WithWrap(err)) } data := q.Next(int(n)) msg := new(AnyOperation) err = proto.Unmarshal(data, msg) if err != nil { - return nil, 0, nil, nil, errors.New(errors.Decode, op, "error unmarshaling message", errors.WithWrap(err)) + return nil, 0, nil, nil, errors.NewDeprecated(errors.Decode, op, "error unmarshaling message", errors.WithWrap(err)) } if msg.Value == nil { return nil, 0, nil, nil, nil } any, err := q.Catalog.Get(msg.TypeName) if err != nil { - return nil, 0, nil, nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("error getting the TypeName: %s", msg.TypeName))) + return nil, 0, nil, nil, errors.WrapDeprecated(err, op, errors.WithMsg(fmt.Sprintf("error getting the TypeName: %s", msg.TypeName))) } pm := any.(proto.Message) if err = proto.Unmarshal(msg.Value, pm); err != nil { - return nil, 0, nil, nil, errors.New(errors.Decode, op, "error unmarshaling value", errors.WithWrap(err)) + return nil, 0, nil, nil, errors.NewDeprecated(errors.Decode, op, "error unmarshaling value", errors.WithWrap(err)) } var masks, nullPaths []string if msg.OperationType == OpType_OP_TYPE_UPDATE { @@ -136,7 +136,7 @@ func (q *Queue) Remove() (proto.Message, OpType, []string, []string, error) { nullPaths = msg.NullMask.GetPaths() } if len(masks) == 0 && len(nullPaths) == 0 { - return nil, 0, nil, nil, errors.New(errors.InvalidParameter, op, "field mask or null paths is required") + return nil, 0, nil, nil, errors.NewDeprecated(errors.InvalidParameter, op, "field mask or null paths is required") } } diff --git a/internal/oplog/ticketer.go b/internal/oplog/ticketer.go index 75d8942fa..3fb19cb6a 100644 --- a/internal/oplog/ticketer.go +++ b/internal/oplog/ticketer.go @@ -33,7 +33,7 @@ type GormTicketer struct { func NewGormTicketer(tx *gorm.DB, opt ...Option) (*GormTicketer, error) { const op = "oplog.NewGormTicketer" if tx == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil tx") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil tx") } opts := GetOpts(opt...) enableAggregateNames := opts[optionWithAggregateNames].(bool) @@ -45,7 +45,7 @@ func NewGormTicketer(tx *gorm.DB, opt ...Option) (*GormTicketer, error) { func (ticketer *GormTicketer) GetTicket(aggregateName string) (*store.Ticket, error) { const op = "oplog.(GormTicketer).GetTicket" if aggregateName == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing ticket name") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing ticket name") } name := DefaultAggregateName if ticketer.withAggregateNames { @@ -54,9 +54,9 @@ func (ticketer *GormTicketer) GetTicket(aggregateName string) (*store.Ticket, er ticket := store.Ticket{} if err := ticketer.tx.First(&ticket, store.Ticket{Name: name}).Error; err != nil { if gorm.IsRecordNotFoundError(err) { - return nil, errors.New(errors.TicketNotFound, op, "ticket not found") + return nil, errors.NewDeprecated(errors.TicketNotFound, op, "ticket not found") } - return nil, errors.Wrap(err, op, errors.WithMsg("error retrieving ticket from storage")) + return nil, errors.WrapDeprecated(err, op, errors.WithMsg("error retrieving ticket from storage")) } return &ticket, nil } @@ -65,14 +65,14 @@ func (ticketer *GormTicketer) GetTicket(aggregateName string) (*store.Ticket, er func (ticketer *GormTicketer) Redeem(t *store.Ticket) error { const op = "oplog.(GormTicketer).Redeem" if t == nil { - return errors.New(errors.InvalidParameter, op, "nil ticket") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil ticket") } tx := ticketer.tx.Model(t).Where("version = ?", t.Version).Update("version", t.Version+1) if tx.Error != nil { - return errors.Wrap(tx.Error, op, errors.WithMsg("error trying to redeem ticket")) + return errors.WrapDeprecated(tx.Error, op, errors.WithMsg("error trying to redeem ticket")) } if tx.RowsAffected != 1 { - return errors.New(errors.TicketAlreadyRedeemed, op, "ticket already redeemed") + return errors.NewDeprecated(errors.TicketAlreadyRedeemed, op, "ticket already redeemed") } return nil } diff --git a/internal/oplog/type_catalog.go b/internal/oplog/type_catalog.go index 74d0aabda..dede168a2 100644 --- a/internal/oplog/type_catalog.go +++ b/internal/oplog/type_catalog.go @@ -26,10 +26,10 @@ func NewTypeCatalog(withTypes ...Type) (*TypeCatalog, error) { reg := TypeCatalog{} for _, t := range withTypes { if t == (Type{}) { - return nil, errors.New(errors.InvalidParameter, op, "error type is {}") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "error type is {}") } if err := reg.Set(t.Interface, t.Name); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("error setting the type")) + return nil, errors.WrapDeprecated(err, op, errors.WithMsg("error setting the type")) } } return ®, nil @@ -39,10 +39,10 @@ func NewTypeCatalog(withTypes ...Type) (*TypeCatalog, error) { func (t *TypeCatalog) GetTypeName(i interface{}) (string, error) { const op = "oplog.(TypeCatalog).GetTypeName" if i == nil { - return "", errors.New(errors.InvalidParameter, op, "nil interface") + return "", errors.NewDeprecated(errors.InvalidParameter, op, "nil interface") } if reflect.ValueOf(i).Kind() != reflect.Ptr { - return "", errors.New(errors.InvalidParameter, op, "interface must to be a pointer") + return "", errors.NewDeprecated(errors.InvalidParameter, op, "interface must to be a pointer") } interfaceType := reflect.TypeOf(i) for name, t := range *t { @@ -50,20 +50,20 @@ func (t *TypeCatalog) GetTypeName(i interface{}) (string, error) { return name, nil } } - return "", errors.New(errors.InvalidParameter, op, fmt.Sprintf("unknown name for interface: %T", i)) + return "", errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("unknown name for interface: %T", i)) } // Set creates an entry in the catalog for the interface func (t TypeCatalog) Set(i interface{}, typeName string) error { const op = "oplog.(TypeCatalog).Set" if i == nil { - return errors.New(errors.InvalidParameter, op, "nil interface") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil interface") } if reflect.ValueOf(i).Kind() != reflect.Ptr { - return errors.New(errors.InvalidParameter, op, "interface must to be a pointer") + return errors.NewDeprecated(errors.InvalidParameter, op, "interface must to be a pointer") } if typeName == "" { - return errors.New(errors.InvalidParameter, op, "missing type name") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing type name") } t[typeName] = reflect.TypeOf(i) return nil @@ -73,10 +73,10 @@ func (t TypeCatalog) Set(i interface{}, typeName string) error { func (t TypeCatalog) Get(typeName string) (interface{}, error) { const op = "oplog.(TypeCatalog).Get" if typeName == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing type name") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing type name") } if typ, ok := t[typeName]; ok { return reflect.New(typ.Elem()).Elem().Addr().Interface(), nil } - return nil, errors.New(errors.KeyNotFound, op, "type name not found") + return nil, errors.NewDeprecated(errors.KeyNotFound, op, "type name not found") } diff --git a/internal/oplog/writer.go b/internal/oplog/writer.go index d9724ed97..4fbb5d00a 100644 --- a/internal/oplog/writer.go +++ b/internal/oplog/writer.go @@ -42,13 +42,13 @@ type GormWriter struct { func (w *GormWriter) Create(i interface{}) error { const op = "oplog.(GormWriter).Create" if w.Tx == nil { - return errors.New(errors.InvalidParameter, op, "nil tx") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil tx") } if i == nil { - return errors.New(errors.InvalidParameter, op, "nil interface") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil interface") } if err := w.Tx.Create(i).Error; err != nil { - return errors.Wrap(err, op) + return errors.WrapDeprecated(err, op) } return nil } @@ -59,22 +59,22 @@ func (w *GormWriter) Create(i interface{}) error { func (w *GormWriter) Update(i interface{}, fieldMaskPaths, setToNullPaths []string) error { const op = "oplog.(GormWriter).Update" if w.Tx == nil { - return errors.New(errors.InvalidParameter, op, "nil tx") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil tx") } if i == nil { - return errors.New(errors.InvalidParameter, op, "nil interface") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil interface") } if len(fieldMaskPaths) == 0 && len(setToNullPaths) == 0 { - return errors.New(errors.InvalidParameter, op, "missing field mask paths and set to null paths") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing field mask paths and set to null paths") } // common.UpdateFields will also check to ensure that fieldMaskPaths and // setToNullPaths do not intersect. updateFields, err := common.UpdateFields(i, fieldMaskPaths, setToNullPaths) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to build update fields")) + return errors.WrapDeprecated(err, op, errors.WithMsg("unable to build update fields")) } if err := w.Tx.Model(i).Updates(updateFields).Error; err != nil { - return errors.Wrap(err, op) + return errors.WrapDeprecated(err, op) } return nil } @@ -83,13 +83,13 @@ func (w *GormWriter) Update(i interface{}, fieldMaskPaths, setToNullPaths []stri func (w *GormWriter) Delete(i interface{}) error { const op = "oplog.(GormWriter).Delete" if w.Tx == nil { - return errors.New(errors.InvalidParameter, op, "nil tx") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil tx") } if i == nil { - return errors.New(errors.InvalidParameter, op, "nil interface") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil interface") } if err := w.Tx.Delete(i).Error; err != nil { - return errors.Wrap(err, op) + return errors.WrapDeprecated(err, op) } return nil } @@ -107,10 +107,10 @@ func (w *GormWriter) hasTable(tableName string) bool { func (w *GormWriter) createTableLike(existingTableName string, newTableName string) error { const op = "oplog.(GormWriter).createTableLike" if existingTableName == "" { - return errors.New(errors.InvalidParameter, op, "missing existing table name") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing existing table name") } if newTableName == "" { - return errors.New(errors.InvalidParameter, op, "missing new table name") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing new table name") } existingTableName = w.Tx.Dialect().Quote(existingTableName) newTableName = w.Tx.Dialect().Quote(newTableName) @@ -128,11 +128,11 @@ func (w *GormWriter) createTableLike(existingTableName string, newTableName stri existingTableName, ) default: - return errors.New(errors.InvalidParameter, op, "unsupported RDBMS") + return errors.NewDeprecated(errors.InvalidParameter, op, "unsupported RDBMS") } err := w.Tx.Exec(sql).Error if err != nil { - return errors.Wrap(err, op) + return errors.WrapDeprecated(err, op) } return nil } @@ -141,11 +141,11 @@ func (w *GormWriter) createTableLike(existingTableName string, newTableName stri func (w *GormWriter) dropTableIfExists(tableName string) error { const op = "oplog.(GormWriter).dropTableIfExists" if tableName == "" { - return errors.New(errors.InvalidParameter, op, "missing table name") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing table name") } err := w.Tx.DropTableIfExists(tableName).Error if err != nil { - return errors.Wrap(err, op) + return errors.WrapDeprecated(err, op) } return nil } diff --git a/internal/perms/grants.go b/internal/perms/grants.go index 63450fa44..0b41cf05b 100644 --- a/internal/perms/grants.go +++ b/internal/perms/grants.go @@ -149,7 +149,7 @@ func (g Grant) MarshalJSON() ([]byte, error) { } b, err := json.Marshal(res) if err != nil { - return nil, errors.Wrap(err, op, errors.WithCode(errors.Encode)) + return nil, errors.WrapDeprecated(err, op, errors.WithCode(errors.Encode)) } return b, nil } @@ -161,29 +161,29 @@ func (g *Grant) unmarshalJSON(data []byte) error { const op = "perms.(Grant).unmarshalJSON" raw := make(map[string]interface{}, 4) if err := json.Unmarshal(data, &raw); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decode)) + return errors.WrapDeprecated(err, op, errors.WithCode(errors.Decode)) } if rawId, ok := raw["id"]; ok { id, ok := rawId.(string) if !ok { - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("unable to interpret %q as string", "id")) + return errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("unable to interpret %q as string", "id")) } g.id = id } if rawType, ok := raw["type"]; ok { typ, ok := rawType.(string) if !ok { - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("unable to interpret %q as string", "type")) + return errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("unable to interpret %q as string", "type")) } g.typ = resource.Map[typ] if g.typ == resource.Unknown { - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("unknown type specifier %q", typ)) + return errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("unknown type specifier %q", typ)) } } if rawActions, ok := raw["actions"]; ok { interfaceActions, ok := rawActions.([]interface{}) if !ok { - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("unable to interpret %q as array", "actions")) + return errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("unable to interpret %q as array", "actions")) } if len(interfaceActions) > 0 { g.actionsBeingParsed = make([]string, 0, len(interfaceActions)) @@ -191,9 +191,9 @@ func (g *Grant) unmarshalJSON(data []byte) error { actionStr, ok := v.(string) switch { case !ok: - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("unable to interpret %v in actions array as string", v)) + return errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("unable to interpret %v in actions array as string", v)) case actionStr == "": - return errors.New(errors.InvalidParameter, op, "empty action found") + return errors.NewDeprecated(errors.InvalidParameter, op, "empty action found") default: g.actionsBeingParsed = append(g.actionsBeingParsed, strings.ToLower(actionStr)) } @@ -203,7 +203,7 @@ func (g *Grant) unmarshalJSON(data []byte) error { if rawOutputFields, ok := raw["output_fields"]; ok { interfaceOutputFields, ok := rawOutputFields.([]interface{}) if !ok { - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("unable to interpret %q as array", "output_fields")) + return errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("unable to interpret %q as array", "output_fields")) } // We do the make here because we detect later if the field was set but // no values given @@ -213,7 +213,7 @@ func (g *Grant) unmarshalJSON(data []byte) error { field, ok := v.(string) switch { case !ok: - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("unable to interpret %v in output_fields array as string", v)) + return errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("unable to interpret %v in output_fields array as string", v)) default: g.OutputFields[field] = true } @@ -232,11 +232,11 @@ func (g *Grant) unmarshalText(grantString string) error { // Ensure we don't accept "foo=bar=baz", "=foo", or "foo=" switch { case len(kv) != 2: - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("segment %q not formatted correctly, wrong number of equal signs", segment)) + return errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("segment %q not formatted correctly, wrong number of equal signs", segment)) case len(kv[0]) == 0: - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("segment %q not formatted correctly, missing key", segment)) + return errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("segment %q not formatted correctly, missing key", segment)) case len(kv[1]) == 0: - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("segment %q not formatted correctly, missing value", segment)) + return errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("segment %q not formatted correctly, missing value", segment)) } switch kv[0] { @@ -247,7 +247,7 @@ func (g *Grant) unmarshalText(grantString string) error { typeString := strings.ToLower(kv[1]) g.typ = resource.Map[typeString] if g.typ == resource.Unknown { - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("unknown type specifier %q", typeString)) + return errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("unknown type specifier %q", typeString)) } case "actions": @@ -256,7 +256,7 @@ func (g *Grant) unmarshalText(grantString string) error { g.actionsBeingParsed = make([]string, 0, len(actions)) for _, action := range actions { if action == "" { - return errors.New(errors.InvalidParameter, op, "empty action found") + return errors.NewDeprecated(errors.InvalidParameter, op, "empty action found") } g.actionsBeingParsed = append(g.actionsBeingParsed, strings.ToLower(action)) } @@ -280,10 +280,10 @@ func (g *Grant) unmarshalText(grantString string) error { func Parse(scopeId, grantString string, opt ...Option) (Grant, error) { const op = "perms.Parse" if len(grantString) == 0 { - return Grant{}, errors.New(errors.InvalidParameter, op, "missing grant string") + return Grant{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing grant string") } if scopeId == "" { - return Grant{}, errors.New(errors.InvalidParameter, op, "missing scope id") + return Grant{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing scope id") } grant := Grant{ @@ -297,18 +297,18 @@ func Parse(scopeId, grantString string, opt ...Option) (Grant, error) { case strings.HasPrefix(scopeId, scope.Project.Prefix()): grant.scope.Type = scope.Project default: - return Grant{}, errors.New(errors.InvalidParameter, op, "invalid scope type") + return Grant{}, errors.NewDeprecated(errors.InvalidParameter, op, "invalid scope type") } switch { case grantString[0] == '{': if err := grant.unmarshalJSON([]byte(grantString)); err != nil { - return Grant{}, errors.Wrap(err, op, errors.WithMsg("unable to parse JSON grant string")) + return Grant{}, errors.WrapDeprecated(err, op, errors.WithMsg("unable to parse JSON grant string")) } default: if err := grant.unmarshalText(grantString); err != nil { - return Grant{}, errors.Wrap(err, op, errors.WithMsg("unable to parse grant string")) + return Grant{}, errors.WrapDeprecated(err, op, errors.WithMsg("unable to parse grant string")) } } @@ -329,16 +329,16 @@ func Parse(scopeId, grantString string, opt ...Option) (Grant, error) { grant.id = opts.withAccountId } default: - return Grant{}, errors.New(errors.InvalidParameter, op, fmt.Sprintf("unknown template %q in grant %q value", grant.id, "id")) + return Grant{}, errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("unknown template %q in grant %q value", grant.id, "id")) } } if err := grant.validateType(); err != nil { - return Grant{}, errors.Wrap(err, op) + return Grant{}, errors.WrapDeprecated(err, op) } if err := grant.parseAndValidateActions(); err != nil { - return Grant{}, errors.Wrap(err, op) + return Grant{}, errors.WrapDeprecated(err, op) } if !opts.withSkipFinalValidation { @@ -349,7 +349,7 @@ func Parse(scopeId, grantString string, opt ...Option) (Grant, error) { if grant.id != "" && grant.typ == resource.Unknown { if grant.actions[action.Create] || grant.actions[action.List] { - return Grant{}, errors.New(errors.InvalidParameter, op, "parsed grant string contains create or list action in a format that does not allow these") + return Grant{}, errors.NewDeprecated(errors.InvalidParameter, op, "parsed grant string contains create or list action in a format that does not allow these") } } // If no ID is given... @@ -359,11 +359,11 @@ func Parse(scopeId, grantString string, opt ...Option) (Grant, error) { case resource.Unknown: // Error -- no ID or type isn't valid (although we should never // get to this point because original parsing should error) - return Grant{}, errors.New(errors.InvalidParameter, op, "parsed grant string contains no id or type") + return Grant{}, errors.NewDeprecated(errors.InvalidParameter, op, "parsed grant string contains no id or type") case resource.All: // "type=*;actions=..." is not supported -- we reqiure you to // explicitly set a pin or set the ID to * - return Grant{}, errors.New(errors.InvalidParameter, op, "parsed grant string contains wildcard type with no id value") + return Grant{}, errors.NewDeprecated(errors.InvalidParameter, op, "parsed grant string contains wildcard type with no id value") default: // Here we have type=something,actions=. This // means we're operating on collections. Note that wildcard @@ -373,24 +373,24 @@ func Parse(scopeId, grantString string, opt ...Option) (Grant, error) { case 0: // A total lack of actions is already caught elsewhere but // this is here for completeness - return Grant{}, errors.New(errors.InvalidParameter, op, "parsed grant string contains no actions") + return Grant{}, errors.NewDeprecated(errors.InvalidParameter, op, "parsed grant string contains no actions") case 1: if !grant.actions[action.Create] && !grant.actions[action.List] { - return Grant{}, errors.New(errors.InvalidParameter, op, "parsed grant string contains non-create or non-list action in a format that only allows these") + return Grant{}, errors.NewDeprecated(errors.InvalidParameter, op, "parsed grant string contains non-create or non-list action in a format that only allows these") } case 2: if !grant.actions[action.Create] || !grant.actions[action.List] { - return Grant{}, errors.New(errors.InvalidParameter, op, "parsed grant string contains non-create or non-list action in a format that only allows these") + return Grant{}, errors.NewDeprecated(errors.InvalidParameter, op, "parsed grant string contains non-create or non-list action in a format that only allows these") } default: - return Grant{}, errors.New(errors.InvalidParameter, op, "parsed grant string contains non-create or non-list action in a format that only allows these") + return Grant{}, errors.NewDeprecated(errors.InvalidParameter, op, "parsed grant string contains non-create or non-list action in a format that only allows these") } } } // Set but empty output fields... if grant.OutputFields != nil && len(grant.OutputFields) == 0 { - return Grant{}, errors.New(errors.InvalidParameter, op, "parsed grant string has output_fields set but empty") + return Grant{}, errors.NewDeprecated(errors.InvalidParameter, op, "parsed grant string has output_fields set but empty") } // This might be zero if output fields is populated if len(grant.actions) > 0 { @@ -413,7 +413,7 @@ func Parse(scopeId, grantString string, opt ...Option) (Grant, error) { } } if !allowed { - return Grant{}, errors.New(errors.InvalidParameter, op, "parsed grant string would not result in any action being authorized") + return Grant{}, errors.NewDeprecated(errors.InvalidParameter, op, "parsed grant string would not result in any action being authorized") } } } @@ -440,7 +440,7 @@ func (g Grant) validateType() error { resource.Session: return nil } - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("unknown type specifier %q", g.typ)) + return errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("unknown type specifier %q", g.typ)) } func (g *Grant) parseAndValidateActions() error { @@ -452,25 +452,25 @@ func (g *Grant) parseAndValidateActions() error { if len(g.OutputFields) > 0 { return nil } - return errors.New(errors.InvalidParameter, op, "missing actions") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing actions") } for _, a := range g.actionsBeingParsed { if a == "" { - return errors.New(errors.InvalidParameter, op, "empty action found") + return errors.NewDeprecated(errors.InvalidParameter, op, "empty action found") } if g.actions == nil { g.actions = make(map[action.Type]bool, len(g.actionsBeingParsed)) } if am := action.Map[a]; am == action.Unknown { - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("unknown action %q", a)) + return errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("unknown action %q", a)) } else { g.actions[am] = true } } if len(g.actions) > 1 && g.actions[action.All] { - return errors.New(errors.InvalidParameter, op, fmt.Sprintf("%q cannot be specified with other actions", action.All.String())) + return errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("%q cannot be specified with other actions", action.All.String())) } g.actionsBeingParsed = nil diff --git a/internal/scheduler/job.go b/internal/scheduler/job.go index 6e37cc888..a932b3faf 100644 --- a/internal/scheduler/job.go +++ b/internal/scheduler/job.go @@ -42,13 +42,13 @@ type JobStatus struct { func validateJob(j Job) error { const op = "scheduler.validateJob" if j == nil { - return errors.New(errors.InvalidParameter, op, "missing job") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing job") } if j.Name() == "" { - return errors.New(errors.InvalidParameter, op, "missing name") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing name") } if j.Description() == "" { - return errors.New(errors.InvalidParameter, op, "missing description") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing description") } return nil } diff --git a/internal/scheduler/job/repository.go b/internal/scheduler/job/repository.go index c7801f7ee..4e79b9449 100644 --- a/internal/scheduler/job/repository.go +++ b/internal/scheduler/job/repository.go @@ -26,11 +26,11 @@ func NewRepository(r db.Reader, w db.Writer, kms *kms.Kms, opt ...Option) (*Repo const op = "job.NewRepository" switch { case r == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing db reader") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing db reader") case w == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing db writer") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing db writer") case kms == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing kms") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing kms") } opts := getOpts(opt...) diff --git a/internal/scheduler/job/repository_job.go b/internal/scheduler/job/repository_job.go index 89303dec0..7e56077bc 100644 --- a/internal/scheduler/job/repository_job.go +++ b/internal/scheduler/job/repository_job.go @@ -20,10 +20,10 @@ import ( func (r *Repository) CreateJob(ctx context.Context, name, description string, opt ...Option) (*Job, error) { const op = "job.(Repository).CreateJob" if name == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing name") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing name") } if description == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing description") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing description") } opts := getOpts(opt...) @@ -38,24 +38,24 @@ func (r *Repository) CreateJob(ctx context.Context, name, description string, op int(opts.withNextRunIn.Round(time.Second).Seconds()), }) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } defer rows.Close() var rowCnt int for rows.Next() { if rowCnt > 0 { - return errors.New(errors.MultipleRecords, op, "more than 1 job would have been created") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 job would have been created") } rowCnt++ err = r.ScanRows(rows, j) if err != nil { _ = rows.Close() - return errors.Wrap(err, op, errors.WithMsg("unable to scan rows for job")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to scan rows for job")) } } if rowCnt == 0 { - return errors.New(errors.NotSpecificIntegrity, op, "failed to create new job") + return errors.New(ctx, errors.NotSpecificIntegrity, op, "failed to create new job") } return nil @@ -63,9 +63,9 @@ func (r *Repository) CreateJob(ctx context.Context, name, description string, op ) if err != nil { if errors.IsUniqueError(err) { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("name %s already exists", name))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("name %s already exists", name))) } - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return j, nil } @@ -78,7 +78,7 @@ func (r *Repository) CreateJob(ctx context.Context, name, description string, op func (r *Repository) UpdateJobNextRunInAtLeast(ctx context.Context, name string, nextRunInAtLeast time.Duration, _ ...Option) (*Job, error) { const op = "job.(Repository).UpdateJobNextRunInAtLeast" if name == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing name") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing name") } j := allocJob() @@ -86,7 +86,7 @@ func (r *Repository) UpdateJobNextRunInAtLeast(ctx context.Context, name string, func(r db.Reader, w db.Writer) error { rows, err := w.Query(ctx, setNextScheduledRunIfSoonerQuery, []interface{}{int(nextRunInAtLeast.Round(time.Second).Seconds()), defaultPluginId, name}) if err != nil { - return errors.Wrap(err, op, errors.WithMsg( + return errors.Wrap(ctx, err, op, errors.WithMsg( fmt.Sprintf("failed to set next scheduled run time for job %v", name))) } defer rows.Close() @@ -94,24 +94,24 @@ func (r *Repository) UpdateJobNextRunInAtLeast(ctx context.Context, name string, var rowCnt int for rows.Next() { if rowCnt > 0 { - return errors.New(errors.MultipleRecords, op, "more than 1 job would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 job would have been updated") } rowCnt++ err = r.ScanRows(rows, j) if err != nil { _ = rows.Close() - return errors.Wrap(err, op, errors.WithMsg("unable to scan rows")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to scan rows")) } } if rowCnt == 0 { - return errors.New(errors.RecordNotFound, op, fmt.Sprintf("job %q does not exist", name)) + return errors.New(ctx, errors.RecordNotFound, op, fmt.Sprintf("job %q does not exist", name)) } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return j, nil } @@ -123,7 +123,7 @@ func (r *Repository) UpdateJobNextRunInAtLeast(ctx context.Context, name string, func (r *Repository) LookupJob(ctx context.Context, name string, _ ...Option) (*Job, error) { const op = "job.(Repository).LookupJob" if name == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing name") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing name") } j := allocJob() @@ -131,7 +131,7 @@ func (r *Repository) LookupJob(ctx context.Context, name string, _ ...Option) (* if errors.IsNotFoundError(err) { return nil, nil } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %v", name))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %v", name))) } return j, nil } @@ -156,7 +156,7 @@ func (r *Repository) ListJobs(ctx context.Context, opt ...Option) ([]*Job, error var jobs []*Job err := r.reader.SearchWhere(ctx, &jobs, strings.Join(where, " and "), args, db.WithLimit(limit)) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return jobs, nil } @@ -168,7 +168,7 @@ func (r *Repository) ListJobs(ctx context.Context, opt ...Option) ([]*Job, error func (r *Repository) deleteJob(ctx context.Context, name string, _ ...Option) (int, error) { const op = "job.(Repository).deleteJob" if name == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing name") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing name") } j := allocJob() @@ -178,16 +178,16 @@ func (r *Repository) deleteJob(ctx context.Context, name string, _ ...Option) (i func(_ db.Reader, w db.Writer) (err error) { rowsDeleted, err = w.Delete(ctx, j, db.WithWhere("name = ?", []interface{}{name})) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("delete failed for %v", name))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("delete failed for %v", name))) } return rowsDeleted, nil diff --git a/internal/scheduler/job/repository_run.go b/internal/scheduler/job/repository_run.go index 13512ed4c..fb305e5a8 100644 --- a/internal/scheduler/job/repository_run.go +++ b/internal/scheduler/job/repository_run.go @@ -19,7 +19,7 @@ import ( func (r *Repository) RunJobs(ctx context.Context, serverId string, opt ...Option) ([]*Run, error) { const op = "job.(Repository).RunJobs" if serverId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing server id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing server id") } opts := getOpts(opt...) @@ -28,7 +28,7 @@ func (r *Repository) RunJobs(ctx context.Context, serverId string, opt ...Option func(r db.Reader, w db.Writer) error { rows, err := w.Query(ctx, runJobsQuery, []interface{}{serverId, opts.withRunJobsLimit}) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } defer rows.Close() @@ -36,7 +36,7 @@ func (r *Repository) RunJobs(ctx context.Context, serverId string, opt ...Option run := allocRun() err = r.ScanRows(rows, run) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to scan rows for job run")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to scan rows for job run")) } runs = append(runs, run) } @@ -45,7 +45,7 @@ func (r *Repository) RunJobs(ctx context.Context, serverId string, opt ...Option }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return runs, nil } @@ -58,7 +58,7 @@ func (r *Repository) RunJobs(ctx context.Context, serverId string, opt ...Option func (r *Repository) UpdateProgress(ctx context.Context, runId string, completed, total int, _ ...Option) (*Run, error) { const op = "job.(Repository).UpdateProgress" if runId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing run id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing run id") } run := allocRun() @@ -67,38 +67,38 @@ func (r *Repository) UpdateProgress(ctx context.Context, runId string, completed func(r db.Reader, w db.Writer) error { rows, err := w.Query(ctx, updateProgressQuery, []interface{}{completed, total, runId}) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } defer rows.Close() var rowCnt int for rows.Next() { if rowCnt > 0 { - return errors.New(errors.MultipleRecords, op, "more than 1 job run would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 job run would have been updated") } rowCnt++ err = r.ScanRows(rows, run) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to scan rows for job run")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to scan rows for job run")) } } if rowCnt == 0 { // Failed to update run, either it does not exist or was in an invalid state if err = r.LookupById(ctx, run); err != nil { if errors.IsNotFoundError(err) { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("job run %q does not exist", runId))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("job run %q does not exist", runId))) } - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } - return errors.New(errors.InvalidJobRunState, op, fmt.Sprintf("job run was in a final run state: %v", run.Status)) + return errors.New(ctx, errors.InvalidJobRunState, op, fmt.Sprintf("job run was in a final run state: %v", run.Status), errors.WithoutEvent()) } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op, errors.WithoutEvent()) } return run, nil @@ -118,7 +118,7 @@ func (r *Repository) UpdateProgress(ctx context.Context, runId string, completed func (r *Repository) CompleteRun(ctx context.Context, runId string, nextRunIn time.Duration, completed, total int, _ ...Option) (*Run, error) { const op = "job.(Repository).CompleteRun" if runId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing run id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing run id") } run := allocRun() @@ -131,36 +131,36 @@ func (r *Repository) CompleteRun(ctx context.Context, runId string, nextRunIn ti // values are used in the critical path. rows, err := w.Query(ctx, completeRunQuery, []interface{}{completed, total, runId}) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } defer rows.Close() var rowCnt int for rows.Next() { if rowCnt > 0 { - return errors.New(errors.MultipleRecords, op, "more than 1 job run would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 job run would have been updated") } rowCnt++ err = r.ScanRows(rows, run) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to scan rows for job run")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to scan rows for job run")) } } if rowCnt == 0 { // Failed to update run, either it does not exist or was in an invalid state if err = r.LookupById(ctx, run); err != nil { if errors.IsNotFoundError(err) { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("job run %q does not exist", runId))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("job run %q does not exist", runId))) } - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } - return errors.New(errors.InvalidJobRunState, op, fmt.Sprintf("job run was in a final run state: %v", run.Status)) + return errors.New(ctx, errors.InvalidJobRunState, op, fmt.Sprintf("job run was in a final run state: %v", run.Status), errors.WithoutEvent()) } rows1, err := w.Query(ctx, setNextScheduledRunQuery, []interface{}{int(nextRunIn.Round(time.Second).Seconds()), run.JobPluginId, run.JobName}) if err != nil { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed to set next scheduled run time for job: %s", run.JobName))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed to set next scheduled run time for job: %s", run.JobName))) } defer rows1.Close() @@ -168,12 +168,12 @@ func (r *Repository) CompleteRun(ctx context.Context, runId string, nextRunIn ti rowCnt = 0 for rows1.Next() { if rowCnt > 0 { - return errors.New(errors.MultipleRecords, op, "more than 1 job would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 job would have been updated") } rowCnt++ err = r.ScanRows(rows1, job) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to scan rows for job")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to scan rows for job")) } } @@ -181,7 +181,7 @@ func (r *Repository) CompleteRun(ctx context.Context, runId string, nextRunIn ti }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return run, nil @@ -198,7 +198,7 @@ func (r *Repository) CompleteRun(ctx context.Context, runId string, nextRunIn ti func (r *Repository) FailRun(ctx context.Context, runId string, completed, total int, _ ...Option) (*Run, error) { const op = "job.(Repository).FailRun" if runId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing run id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing run id") } run := allocRun() @@ -211,38 +211,38 @@ func (r *Repository) FailRun(ctx context.Context, runId string, completed, total // values are used in the critical path. rows, err := w.Query(ctx, failRunQuery, []interface{}{completed, total, runId}) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } defer rows.Close() var rowCnt int for rows.Next() { if rowCnt > 0 { - return errors.New(errors.MultipleRecords, op, "more than 1 job run would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 job run would have been updated") } rowCnt++ err = r.ScanRows(rows, run) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to scan rows for job run")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to scan rows for job run")) } } if rowCnt == 0 { // Failed to update run, either it does not exist or was in an invalid state if err = r.LookupById(ctx, run); err != nil { if errors.IsNotFoundError(err) { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("job run %q does not exist", runId))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("job run %q does not exist", runId))) } - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } - return errors.New(errors.InvalidJobRunState, op, fmt.Sprintf("job run was in a final run state: %v", run.Status)) + return errors.New(ctx, errors.InvalidJobRunState, op, fmt.Sprintf("job run was in a final run state: %v", run.Status), errors.WithoutEvent()) } return nil }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return run, nil @@ -275,7 +275,7 @@ func (r *Repository) InterruptRuns(ctx context.Context, interruptThreshold time. func(r db.Reader, w db.Writer) error { rows, err := w.Query(ctx, query, args) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } defer rows.Close() @@ -283,7 +283,7 @@ func (r *Repository) InterruptRuns(ctx context.Context, interruptThreshold time. run := allocRun() err = r.ScanRows(rows, run) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to scan rows for job run")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to scan rows for job run")) } runs = append(runs, run) } @@ -292,7 +292,7 @@ func (r *Repository) InterruptRuns(ctx context.Context, interruptThreshold time. }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return runs, nil @@ -305,7 +305,7 @@ func (r *Repository) InterruptRuns(ctx context.Context, interruptThreshold time. func (r *Repository) LookupRun(ctx context.Context, runId string, _ ...Option) (*Run, error) { const op = "job.(Repository).LookupRun" if runId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing run id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing run id") } run := allocRun() @@ -314,7 +314,7 @@ func (r *Repository) LookupRun(ctx context.Context, runId string, _ ...Option) ( if errors.IsNotFoundError(err) { return nil, nil } - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", runId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", runId))) } return run, nil } @@ -326,7 +326,7 @@ func (r *Repository) LookupRun(ctx context.Context, runId string, _ ...Option) ( func (r *Repository) deleteRun(ctx context.Context, runId string, _ ...Option) (int, error) { const op = "job.(Repository).deleteRun" if runId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing run id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing run id") } run := allocRun() @@ -337,16 +337,16 @@ func (r *Repository) deleteRun(ctx context.Context, runId string, _ ...Option) ( func(_ db.Reader, w db.Writer) (err error) { rowsDeleted, err = w.Delete(ctx, run) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("delete failed for %s", runId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("delete failed for %s", runId))) } return rowsDeleted, nil diff --git a/internal/scheduler/scheduler.go b/internal/scheduler/scheduler.go index 1c59b2626..5a8a0d546 100644 --- a/internal/scheduler/scheduler.go +++ b/internal/scheduler/scheduler.go @@ -50,13 +50,13 @@ type Scheduler struct { func New(serverId string, jobRepoFn jobRepoFactory, logger hclog.Logger, opt ...Option) (*Scheduler, error) { const op = "scheduler.New" if serverId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing server id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing server id") } if jobRepoFn == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing job repo function") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing job repo function") } if logger == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing logger") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing logger") } opts := getOpts(opt...) @@ -81,7 +81,7 @@ func New(serverId string, jobRepoFn jobRepoFactory, logger hclog.Logger, opt ... func (s *Scheduler) RegisterJob(ctx context.Context, j Job, opt ...Option) error { const op = "scheduler.(Scheduler).RegisterJob" if err := validateJob(j); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if _, ok := s.registeredJobs.Load(j.Name()); ok { @@ -91,13 +91,13 @@ func (s *Scheduler) RegisterJob(ctx context.Context, j Job, opt ...Option) error repo, err := s.jobRepoFn() if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } opts := getOpts(opt...) _, err = repo.CreateJob(ctx, j.Name(), j.Description(), job.WithNextRunIn(opts.withNextRunIn)) if err != nil && !errors.IsUniqueError(err) { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } s.registeredJobs.Store(j.Name(), j) @@ -113,16 +113,16 @@ func (s *Scheduler) RegisterJob(ctx context.Context, j Job, opt ...Option) error func (s *Scheduler) UpdateJobNextRunInAtLeast(ctx context.Context, name string, nextRunInAtLeast time.Duration, _ ...Option) error { const op = "scheduler.(Scheduler).UpdateJobNextRunInAtLeast" if name == "" { - return errors.New(errors.InvalidParameter, op, "missing name") + return errors.New(ctx, errors.InvalidParameter, op, "missing name") } repo, err := s.jobRepoFn() if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } _, err = repo.UpdateJobNextRunInAtLeast(ctx, name, nextRunInAtLeast) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -139,25 +139,25 @@ func (s *Scheduler) Start(ctx context.Context, wg *sync.WaitGroup) error { return nil } if ctx == nil { - return errors.New(errors.InvalidParameter, op, "missing context") + return errors.New(ctx, errors.InvalidParameter, op, "missing context") } if wg == nil { - return errors.New(errors.InvalidParameter, op, "missing wait group") + return errors.New(ctx, errors.InvalidParameter, op, "missing wait group") } if err := ctx.Err(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } repo, err := s.jobRepoFn() if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } // Interrupt all runs previously allocated to this server _, err = repo.InterruptRuns(ctx, 0, job.WithServerId(s.serverId)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } wg.Add(2) diff --git a/internal/servers/common/handler.go b/internal/servers/common/handler.go index 463e7946a..d3f25309d 100644 --- a/internal/servers/common/handler.go +++ b/internal/servers/common/handler.go @@ -42,13 +42,13 @@ func (w *writerWrapper) StatusCode() int { // an http.ResponseWriter that satisfies those optional interfaces. // // See: https://medium.com/@cep21/interface-wrapping-method-erasure-c523b3549912 -func WrapWithOptionals(with *writerWrapper, wrap http.ResponseWriter) (http.ResponseWriter, error) { +func WrapWithOptionals(ctx context.Context, with *writerWrapper, wrap http.ResponseWriter) (http.ResponseWriter, error) { const op = "common.WrapWithOptionals" if with == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing writer wrapper") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing writer wrapper") } if wrap == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing response writer") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing response writer") } flusher, _ := wrap.(http.Flusher) pusher, _ := wrap.(http.Pusher) @@ -105,13 +105,13 @@ func WrapWithOptionals(with *writerWrapper, wrap http.ResponseWriter) (http.Resp func WrapWithEventsHandler(h http.Handler, e *event.Eventer, kms *kms.Kms) (http.Handler, error) { const op = "common.WrapWithEventsHandler" if h == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing handler") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing handler") } if e == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing eventer") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing eventer") } if kms == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing kms") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing kms") } return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { ctx := r.Context() @@ -157,7 +157,7 @@ func WrapWithEventsHandler(h http.Handler, e *event.Eventer, kms *kms.Kms) (http return } - wrapper, err := WrapWithOptionals(&writerWrapper{w, http.StatusOK}, w) + wrapper, err := WrapWithOptionals(ctx, &writerWrapper{w, http.StatusOK}, w) if err != nil { w.WriteHeader(http.StatusInternalServerError) event.WriteError(ctx, op, err, event.WithInfoMsg("unable to wrap handler with optional interfaces")) @@ -185,12 +185,12 @@ func startGatedEvents(ctx context.Context, method, url string, startTime time.Ti } err := event.WriteObservation(ctx, "handler", event.WithHeader("start", startTime)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write observation event")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write observation event")) } err = event.WriteAudit(ctx, "handler") if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write audit event")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write audit event")) } return nil } @@ -213,11 +213,11 @@ func flushGatedEvents(ctx context.Context, method, url string, statusCode int, s ), ) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write and flush observation event")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write and flush observation event")) } err = event.WriteAudit(ctx, "handler", event.WithFlush()) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write and flush audit event")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write and flush audit event")) } return nil } diff --git a/internal/servers/common/handler_test.go b/internal/servers/common/handler_test.go index 8e75636e1..449c261ec 100644 --- a/internal/servers/common/handler_test.go +++ b/internal/servers/common/handler_test.go @@ -28,6 +28,7 @@ import ( func Test_WrapWithOptionals(t *testing.T) { t.Parallel() + ctx := context.TODO() w := httptest.NewRecorder() testWriterWrapper := writerWrapper{w, 0} @@ -132,7 +133,7 @@ func Test_WrapWithOptionals(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { assert, require := assert.New(t), require.New(t) - wrapped, err := WrapWithOptionals(tt.with, tt.wrap) + wrapped, err := WrapWithOptionals(ctx, tt.with, tt.wrap) if tt.wantErrMatch != nil { require.Error(err) assert.Nil(wrapped) @@ -472,11 +473,11 @@ func (b *testMockBroker) Send(ctx context.Context, t eventlogger.EventType, payl _, isGateable := payload.(gated.Gateable) switch { case b.errorOnFlush && isGateable && payload.(gated.Gateable).FlushEvent(): - return eventlogger.Status{}, errors.New(errors.Internal, op, "unable to flush event") + return eventlogger.Status{}, errors.New(ctx, errors.Internal, op, "unable to flush event") case b.errorOnSendAudit && t == eventlogger.EventType(event.AuditType): - return eventlogger.Status{}, errors.New(errors.Internal, op, "unable to send audit event") + return eventlogger.Status{}, errors.New(ctx, errors.Internal, op, "unable to send audit event") case b.errorOnSendObservation && t == eventlogger.EventType(event.ObservationType): - return eventlogger.Status{}, errors.New(errors.Internal, op, "unable to send observation event") + return eventlogger.Status{}, errors.New(ctx, errors.Internal, op, "unable to send observation event") } return eventlogger.Status{}, nil } diff --git a/internal/servers/controller/auth/auth.go b/internal/servers/controller/auth/auth.go index baf5df273..da5998910 100644 --- a/internal/servers/controller/auth/auth.go +++ b/internal/servers/controller/auth/auth.go @@ -197,17 +197,17 @@ func Verify(ctx context.Context, opt ...Option) (ret VerifyResults) { default: iamRepo, err := v.iamRepoFn() if err != nil { - ret.Error = errors.Wrap(err, op, errors.WithMsg("failed to get iam repo")) + ret.Error = errors.Wrap(ctx, err, op, errors.WithMsg("failed to get iam repo")) return } scp, err := iamRepo.LookupScope(v.ctx, ret.Scope.Id) if err != nil { - ret.Error = errors.Wrap(err, op) + ret.Error = errors.Wrap(ctx, err, op) return } if scp == nil { - ret.Error = errors.New(errors.InvalidParameter, op, fmt.Sprint("non-existent scope $q", ret.Scope.Id)) + ret.Error = errors.New(ctx, errors.InvalidParameter, op, fmt.Sprint("non-existent scope $q", ret.Scope.Id)) return } ret.Scope = &scopes.ScopeInfo{ @@ -421,7 +421,7 @@ func (v *verifier) decryptToken(ctx context.Context) { func (v verifier) performAuthCheck(ctx context.Context) (aclResults perms.ACLResults, userId string, scopeInfo *scopes.ScopeInfo, retAcl perms.ACL, retErr error) { const op = "auth.(verifier).performAuthCheck" // Ensure we return an error by default if we forget to set this somewhere - retErr = errors.New(errors.Unknown, op, "default auth error") + retErr = errors.NewDeprecated(errors.Unknown, op, "default auth error", errors.WithoutEvent()) // Make the linter happy _ = retErr scopeInfo = new(scopes.ScopeInfo) @@ -445,7 +445,7 @@ func (v verifier) performAuthCheck(ctx context.Context) (aclResults perms.ACLRes } tokenRepo, err := v.authTokenRepoFn() if err != nil { - retErr = errors.Wrap(err, op) + retErr = errors.WrapDeprecated(err, op) return } at, err := tokenRepo.ValidateToken(v.ctx, v.requestInfo.PublicId, v.requestInfo.Token) @@ -468,7 +468,7 @@ func (v verifier) performAuthCheck(ctx context.Context) (aclResults perms.ACLRes iamRepo, err := v.iamRepoFn() if err != nil { - retErr = errors.Wrap(err, op, errors.WithMsg("failed to get iam repo")) + retErr = errors.WrapDeprecated(err, op, errors.WithMsg("failed to get iam repo")) return } @@ -487,11 +487,11 @@ func (v verifier) performAuthCheck(ctx context.Context) (aclResults perms.ACLRes default: scp, err := iamRepo.LookupScope(v.ctx, v.res.ScopeId) if err != nil { - retErr = errors.Wrap(err, op) + retErr = errors.WrapDeprecated(err, op) return } if scp == nil { - retErr = errors.New(errors.InvalidParameter, op, fmt.Sprint("non-existent scope $q", v.res.ScopeId)) + retErr = errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprint("non-existent scope $q", v.res.ScopeId)) return } scopeInfo = &scopes.ScopeInfo{ @@ -518,7 +518,7 @@ func (v verifier) performAuthCheck(ctx context.Context) (aclResults perms.ACLRes // u_anon and u_auth) grantTuples, err = iamRepo.GrantsForUser(v.ctx, userId) if err != nil { - retErr = errors.Wrap(err, op) + retErr = errors.WrapDeprecated(err, op) return } parsedGrants = make([]perms.Grant, 0, len(grantTuples)) @@ -533,7 +533,7 @@ func (v verifier) performAuthCheck(ctx context.Context) (aclResults perms.ACLRes perms.WithAccountId(accountId), perms.WithSkipFinalValidation(true)) if err != nil { - retErr = errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed to parse grant %#v", pair.Grant))) + retErr = errors.WrapDeprecated(err, op, errors.WithMsg(fmt.Sprintf("failed to parse grant %#v", pair.Grant))) return } parsedGrants = append(parsedGrants, parsed) diff --git a/internal/servers/controller/common/scopeids/scope_ids.go b/internal/servers/controller/common/scopeids/scope_ids.go index 5bb285a29..c4bbed500 100644 --- a/internal/servers/controller/common/scopeids/scope_ids.go +++ b/internal/servers/controller/common/scopeids/scope_ids.go @@ -45,13 +45,13 @@ func GetListingScopeIds( // Validation switch { case typ == resource.Unknown: - return nil, nil, errors.New(errors.InvalidParameter, op, "unknown resource") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "unknown resource") case repoFn == nil: - return nil, nil, errors.New(errors.InvalidParameter, op, "nil iam repo") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "nil iam repo") case rootScopeId == "": - return nil, nil, errors.New(errors.InvalidParameter, op, "missing root scope id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing root scope id") case authResults.Scope == nil: - return nil, nil, errors.New(errors.InvalidParameter, op, "nil scope in auth results") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "nil scope in auth results") } // Base case: if not recursive, return the scope we were given and the @@ -103,7 +103,7 @@ func GetListingScopeIds( } case 1: if aSet[0] != action.List { - return nil, nil, errors.New(errors.Internal, op, "unexpected action in set") + return nil, nil, errors.New(ctx, errors.Internal, op, "unexpected action in set") } if scopeInfoMap[scpId] == nil { scopeInfo := &scopes.ScopeInfo{ @@ -119,7 +119,7 @@ func GetListingScopeIds( globalHasList = true } default: - return nil, nil, errors.New(errors.Internal, op, "unexpected number of actions back in set") + return nil, nil, errors.New(ctx, errors.Internal, op, "unexpected number of actions back in set") } } diff --git a/internal/servers/controller/controller.go b/internal/servers/controller/controller.go index 8a0c5cf2b..693edd768 100644 --- a/internal/servers/controller/controller.go +++ b/internal/servers/controller/controller.go @@ -60,7 +60,7 @@ type Controller struct { kms *kms.Kms } -func New(conf *Config) (*Controller, error) { +func New(ctx context.Context, conf *Config) (*Controller, error) { c := &Controller{ conf: conf, logger: conf.Logger.Named("controller"), @@ -143,7 +143,7 @@ func New(conf *Config) (*Controller, error) { return servers.NewRepository(dbase, dbase, c.kms) } c.OidcRepoFn = func() (*oidc.Repository, error) { - return oidc.NewRepository(dbase, dbase, c.kms) + return oidc.NewRepository(ctx, dbase, dbase, c.kms) } c.PasswordAuthRepoFn = func() (*password.Repository, error) { return password.NewRepository(dbase, dbase, c.kms) diff --git a/internal/servers/controller/handlers/accounts/account_service.go b/internal/servers/controller/handlers/accounts/account_service.go index 19e306832..783c98f5d 100644 --- a/internal/servers/controller/handlers/accounts/account_service.go +++ b/internal/servers/controller/handlers/accounts/account_service.go @@ -104,10 +104,10 @@ type Service struct { func NewService(pwRepo common.PasswordAuthRepoFactory, oidcRepo common.OidcAuthRepoFactory) (Service, error) { const op = "accounts.NewService" if pwRepo == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing password repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing password repository") } if oidcRepo == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing oidc repository provided") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing oidc repository provided") } return Service{pwRepoFn: pwRepo, oidcRepoFn: oidcRepo}, nil } @@ -192,7 +192,7 @@ func (s Service) GetAccount(ctx context.Context, req *pbs.GetAccountRequest) (*p outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -234,7 +234,7 @@ func (s Service) CreateAccount(ctx context.Context, req *pbs.CreateAccountReques outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -273,7 +273,7 @@ func (s Service) UpdateAccount(ctx context.Context, req *pbs.UpdateAccountReques outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -328,7 +328,7 @@ func (s Service) ChangePassword(ctx context.Context, req *pbs.ChangePasswordRequ outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -367,7 +367,7 @@ func (s Service) SetPassword(ctx context.Context, req *pbs.SetPasswordRequest) ( outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -435,7 +435,7 @@ func (s Service) getFromRepo(ctx context.Context, id string) (auth.Account, []st func (s Service) createPwInRepo(ctx context.Context, am auth.AuthMethod, item *pb.Account) (*password.Account, error) { const op = "accounts.(Service).createPwInRepo" if item == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing item") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing item") } pwAttrs := &pb.PasswordAccountAttributes{} if err := handlers.StructToProto(item.GetAttributes(), pwAttrs); err != nil { @@ -464,7 +464,7 @@ func (s Service) createPwInRepo(ctx context.Context, am auth.AuthMethod, item *p } out, err := repo.CreateAccount(ctx, am.GetScopeId(), a, createOpts...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if out == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to create account but no error returned from repository.") @@ -475,7 +475,7 @@ func (s Service) createPwInRepo(ctx context.Context, am auth.AuthMethod, item *p func (s Service) createOidcInRepo(ctx context.Context, am auth.AuthMethod, item *pb.Account) (*oidc.Account, error) { const op = "accounts.(Service).createOidcInRepo" if item == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing item") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing item") } var opts []oidc.Option if item.GetName() != nil { @@ -492,11 +492,11 @@ func (s Service) createOidcInRepo(ctx context.Context, am auth.AuthMethod, item if attrs.GetIssuer() != "" { u, err := url.Parse(attrs.GetIssuer()) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to parse issuer"), errors.WithCode(errors.InvalidParameter)) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to parse issuer"), errors.WithCode(errors.InvalidParameter)) } opts = append(opts, oidc.WithIssuer(u)) } - a, err := oidc.NewAccount(am.GetPublicId(), attrs.GetSubject(), opts...) + a, err := oidc.NewAccount(ctx, am.GetPublicId(), attrs.GetSubject(), opts...) if err != nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to build account for creation: %v.", err) } @@ -507,7 +507,7 @@ func (s Service) createOidcInRepo(ctx context.Context, am auth.AuthMethod, item out, err := repo.CreateAccount(ctx, am.GetScopeId(), a) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create account")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create account")) } if out == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to create account but no error returned from repository.") @@ -518,14 +518,14 @@ func (s Service) createOidcInRepo(ctx context.Context, am auth.AuthMethod, item func (s Service) createInRepo(ctx context.Context, am auth.AuthMethod, item *pb.Account) (auth.Account, error) { const op = "accounts.(Service).createInRepo" if item == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing item") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing item") } var out auth.Account switch auth.SubtypeFromId(am.GetPublicId()) { case password.Subtype: am, err := s.createPwInRepo(ctx, am, item) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if am == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to create account but no error returned from repository.") @@ -534,7 +534,7 @@ func (s Service) createInRepo(ctx context.Context, am auth.AuthMethod, item *pb. case oidc.Subtype: am, err := s.createOidcInRepo(ctx, am, item) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if am == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to create account but no error returned from repository.") @@ -560,7 +560,7 @@ func (s Service) updatePwInRepo(ctx context.Context, scopeId, authMethId, id str } repo, err := s.pwRepoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } out, rowsUpdated, err := repo.UpdateAccount(ctx, scopeId, u, version, dbMask) if err != nil { @@ -569,7 +569,7 @@ func (s Service) updatePwInRepo(ctx context.Context, scopeId, authMethId, id str return nil, handlers.InvalidArgumentErrorf("Error in provided request.", map[string]string{"attributes.login_name": "Length too short."}) } - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if rowsUpdated == 0 { return nil, handlers.NotFoundErrorf("Account %q doesn't exist or incorrect version provided.", id) @@ -580,7 +580,7 @@ func (s Service) updatePwInRepo(ctx context.Context, scopeId, authMethId, id str func (s Service) updateOidcInRepo(ctx context.Context, scopeId, amId, id string, mask []string, item *pb.Account) (*oidc.Account, error) { const op = "accounts.(Service).updateOidcInRepo" if item == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil account.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "nil account.") } u := oidc.AllocAccount() u.PublicId = id @@ -599,11 +599,11 @@ func (s Service) updateOidcInRepo(ctx context.Context, scopeId, amId, id string, } repo, err := s.oidcRepoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } out, rowsUpdated, err := repo.UpdateAccount(ctx, scopeId, u, version, dbMask) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to update account")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to update account")) } if rowsUpdated == 0 { return nil, handlers.NotFoundErrorf("Account %q doesn't exist or incorrect version provided.", id) @@ -618,7 +618,7 @@ func (s Service) updateInRepo(ctx context.Context, scopeId, authMethodId string, case password.Subtype: a, err := s.updatePwInRepo(ctx, scopeId, authMethodId, req.GetId(), req.GetUpdateMask().GetPaths(), req.GetItem()) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if a == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to update account but no error returned from repository.") @@ -627,7 +627,7 @@ func (s Service) updateInRepo(ctx context.Context, scopeId, authMethodId string, case oidc.Subtype: a, err := s.updateOidcInRepo(ctx, scopeId, authMethodId, req.GetId(), req.GetUpdateMask().GetPaths(), req.GetItem()) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if a == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to update account but no error returned from repository.") @@ -659,7 +659,7 @@ func (s Service) deleteFromRepo(ctx context.Context, scopeId, id string) (bool, if errors.IsNotFoundError(err) { return false, nil } - return false, errors.Wrap(err, op) + return false, errors.Wrap(ctx, err, op) } return rows > 0, nil } @@ -672,11 +672,11 @@ func (s Service) listFromRepo(ctx context.Context, authMethodId string) ([]auth. case password.Subtype: pwRepo, err := s.pwRepoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } pwl, err := pwRepo.ListAccounts(ctx, authMethodId) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } for _, a := range pwl { outUl = append(outUl, a) @@ -684,11 +684,11 @@ func (s Service) listFromRepo(ctx context.Context, authMethodId string) ([]auth. case oidc.Subtype: oidcRepo, err := s.oidcRepoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } oidcl, err := oidcRepo.ListAccounts(ctx, authMethodId) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } for _, a := range oidcl { outUl = append(outUl, a) @@ -701,7 +701,7 @@ func (s Service) changePasswordInRepo(ctx context.Context, scopeId, id string, v const op = "account.(Service).changePasswordInRepo" repo, err := s.pwRepoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } out, err := repo.ChangePassword(ctx, scopeId, id, currentPassword, newPassword, version) if err != nil { @@ -715,7 +715,7 @@ func (s Service) changePasswordInRepo(ctx context.Context, scopeId, id string, v return nil, handlers.InvalidArgumentErrorf("Error in provided request.", map[string]string{"new_password": "New password equal to current password."}) } - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if out == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.PermissionDenied, "Failed to change password.") @@ -728,7 +728,7 @@ func (s Service) setPasswordInRepo(ctx context.Context, scopeId, id string, vers repo, err := s.pwRepoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } out, err := repo.SetPassword(ctx, scopeId, id, pw, version) if err != nil { @@ -739,7 +739,7 @@ func (s Service) setPasswordInRepo(ctx context.Context, scopeId, id string, vers return nil, handlers.InvalidArgumentErrorf("Error in provided request.", map[string]string{"password": "Password is too short."}) } - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return out, nil } @@ -889,20 +889,20 @@ func toProto(ctx context.Context, in auth.Account, opt ...handlers.Option) (*pb. m := make(map[string]interface{}) var err error if err = json.Unmarshal([]byte(s), &m); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("error unmarshaling stored token claims")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("error unmarshaling stored token claims")) } if attrs.TokenClaims, err = structpb.NewStruct(m); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("error converting stored token claims to protobuf struct")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("error converting stored token claims to protobuf struct")) } } if s := i.GetUserinfoClaims(); s != "" { m := make(map[string]interface{}) var err error if err = json.Unmarshal([]byte(s), &m); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("error unmarshaling stored userinfo claims")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("error unmarshaling stored userinfo claims")) } if attrs.UserinfoClaims, err = structpb.NewStruct(m); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("error converting stored userinfo claims to protobuf struct")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("error converting stored userinfo claims to protobuf struct")) } } st, err := handlers.ProtoToStruct(attrs) @@ -917,7 +917,7 @@ func toProto(ctx context.Context, in auth.Account, opt ...handlers.Option) (*pb. func toStoragePwAccount(amId string, item *pb.Account) (*password.Account, error) { const op = "accounts.toStoragePwAccount" if item == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil account.") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil account.") } var opts []password.Option if item.GetName() != nil { @@ -951,7 +951,7 @@ func toStoragePwAccount(amId string, item *pb.Account) (*password.Account, error func validateGetRequest(req *pbs.GetAccountRequest) error { const op = "accounts.validateGetRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "nil request") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil request") } return handlers.ValidateGetRequest(handlers.NoopValidatorFn, req, intglobals.OldPasswordAccountPrefix, intglobals.NewPasswordAccountPrefix, oidc.AccountPrefix) } @@ -959,7 +959,7 @@ func validateGetRequest(req *pbs.GetAccountRequest) error { func validateCreateRequest(req *pbs.CreateAccountRequest) error { const op = "accounts.validateCreateRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "nil request") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil request") } return handlers.ValidateCreateRequest(req.GetItem(), func() map[string]string { badFields := map[string]string{} @@ -1014,7 +1014,7 @@ func validateCreateRequest(req *pbs.CreateAccountRequest) error { func validateUpdateRequest(req *pbs.UpdateAccountRequest) error { const op = "accounts.validateUpdateRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "nil request") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil request") } return handlers.ValidateUpdateRequest(req, req.GetItem(), func() map[string]string { badFields := map[string]string{} @@ -1055,7 +1055,7 @@ func validateUpdateRequest(req *pbs.UpdateAccountRequest) error { func validateDeleteRequest(req *pbs.DeleteAccountRequest) error { const op = "accounts.validateDeleteRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "nil request") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil request") } return handlers.ValidateDeleteRequest(handlers.NoopValidatorFn, req, intglobals.OldPasswordAccountPrefix, intglobals.NewPasswordAccountPrefix, oidc.AccountPrefix) } @@ -1063,7 +1063,7 @@ func validateDeleteRequest(req *pbs.DeleteAccountRequest) error { func validateListRequest(req *pbs.ListAccountsRequest) error { const op = "accounts.validateListRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "nil request") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil request") } badFields := map[string]string{} if !handlers.ValidId(handlers.Id(req.GetAuthMethodId()), password.AuthMethodPrefix, oidc.AuthMethodPrefix) { @@ -1081,7 +1081,7 @@ func validateListRequest(req *pbs.ListAccountsRequest) error { func validateChangePasswordRequest(req *pbs.ChangePasswordRequest) error { const op = "accounts.validateChangePasswordRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "nil request") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil request") } badFields := map[string]string{} if !handlers.ValidId(handlers.Id(req.GetId()), intglobals.OldPasswordAccountPrefix, intglobals.NewPasswordAccountPrefix) { @@ -1105,7 +1105,7 @@ func validateChangePasswordRequest(req *pbs.ChangePasswordRequest) error { func validateSetPasswordRequest(req *pbs.SetPasswordRequest) error { const op = "accounts.validateSetPasswordRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "nil request") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil request") } badFields := map[string]string{} if !handlers.ValidId(handlers.Id(req.GetId()), intglobals.OldPasswordAccountPrefix, intglobals.NewPasswordAccountPrefix) { diff --git a/internal/servers/controller/handlers/accounts/account_service_test.go b/internal/servers/controller/handlers/accounts/account_service_test.go index 3290e9c9c..69f1c1255 100644 --- a/internal/servers/controller/handlers/accounts/account_service_test.go +++ b/internal/servers/controller/handlers/accounts/account_service_test.go @@ -55,6 +55,7 @@ var ( ) func TestNewService(t *testing.T) { + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrap := db.TestWrapper(t) @@ -63,7 +64,7 @@ func TestNewService(t *testing.T) { return password.NewRepository(rw, rw, kmsCache) } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kmsCache) + return oidc.NewRepository(ctx, rw, rw, kmsCache) } cases := []struct { @@ -114,7 +115,7 @@ func TestGet(t *testing.T) { return password.NewRepository(rw, rw, kmsCache) } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kmsCache) + return oidc.NewRepository(ctx, rw, rw, kmsCache) } iamRepoFn := func() (*iam.Repository, error) { return iam.NewRepository(rw, rw, kmsCache) @@ -244,6 +245,7 @@ func TestGet(t *testing.T) { } func TestListPassword(t *testing.T) { + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrap := db.TestWrapper(t) @@ -252,7 +254,7 @@ func TestListPassword(t *testing.T) { return password.NewRepository(rw, rw, kms) } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kms) + return oidc.NewRepository(ctx, rw, rw, kms) } iamRepoFn := func() (*iam.Repository, error) { return iam.NewRepository(rw, rw, kms) @@ -386,7 +388,7 @@ func TestListOidc(t *testing.T) { return password.NewRepository(rw, rw, kmsCache) } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kmsCache) + return oidc.NewRepository(ctx, rw, rw, kmsCache) } iamRepoFn := func() (*iam.Repository, error) { return iam.NewRepository(rw, rw, kmsCache) @@ -539,7 +541,7 @@ func TestDelete(t *testing.T) { return password.NewRepository(rw, rw, kmsCache) } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kmsCache) + return oidc.NewRepository(ctx, rw, rw, kmsCache) } iamRepoFn := func() (*iam.Repository, error) { return iam.NewRepository(rw, rw, kmsCache) @@ -625,6 +627,7 @@ func TestDelete(t *testing.T) { } func TestDelete_twice(t *testing.T) { + ctx := context.TODO() assert, require := assert.New(t), require.New(t) conn, _ := db.TestSetup(t, "postgres") wrap := db.TestWrapper(t) @@ -634,7 +637,7 @@ func TestDelete_twice(t *testing.T) { return password.NewRepository(rw, rw, kms) } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kms) + return oidc.NewRepository(ctx, rw, rw, kms) } iamRepoFn := func() (*iam.Repository, error) { return iam.NewRepository(rw, rw, kms) @@ -657,6 +660,7 @@ func TestDelete_twice(t *testing.T) { } func TestCreatePassword(t *testing.T) { + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrap := db.TestWrapper(t) @@ -665,7 +669,7 @@ func TestCreatePassword(t *testing.T) { return password.NewRepository(rw, rw, kms) } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kms) + return oidc.NewRepository(ctx, rw, rw, kms) } iamRepoFn := func() (*iam.Repository, error) { return iam.NewRepository(rw, rw, kms) @@ -867,7 +871,7 @@ func TestCreateOidc(t *testing.T) { return password.NewRepository(rw, rw, kmsCache) } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kmsCache) + return oidc.NewRepository(ctx, rw, rw, kmsCache) } iamRepoFn := func() (*iam.Repository, error) { return iam.NewRepository(rw, rw, kmsCache) @@ -1071,6 +1075,7 @@ func TestCreateOidc(t *testing.T) { } func TestUpdatePassword(t *testing.T) { + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrap := db.TestWrapper(t) @@ -1079,7 +1084,7 @@ func TestUpdatePassword(t *testing.T) { return password.NewRepository(rw, rw, kms) } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kms) + return oidc.NewRepository(ctx, rw, rw, kms) } iamRepoFn := func() (*iam.Repository, error) { return iam.NewRepository(rw, rw, kms) @@ -1460,7 +1465,7 @@ func TestUpdateOidc(t *testing.T) { return password.NewRepository(rw, rw, kmsCache) } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kmsCache) + return oidc.NewRepository(ctx, rw, rw, kmsCache) } iamRepoFn := func() (*iam.Repository, error) { return iam.NewRepository(rw, rw, kmsCache) @@ -1834,6 +1839,7 @@ func TestUpdateOidc(t *testing.T) { } func TestSetPassword(t *testing.T) { + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrap := db.TestWrapper(t) @@ -1842,7 +1848,7 @@ func TestSetPassword(t *testing.T) { return password.NewRepository(rw, rw, kms) } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kms) + return oidc.NewRepository(ctx, rw, rw, kms) } iamRepoFn := func() (*iam.Repository, error) { return iam.NewRepository(rw, rw, kms) @@ -1972,6 +1978,7 @@ func TestSetPassword(t *testing.T) { } func TestChangePassword(t *testing.T) { + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrap := db.TestWrapper(t) @@ -1980,7 +1987,7 @@ func TestChangePassword(t *testing.T) { return password.NewRepository(rw, rw, kms) } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kms) + return oidc.NewRepository(ctx, rw, rw, kms) } iamRepoFn := func() (*iam.Repository, error) { return iam.NewRepository(rw, rw, kms) diff --git a/internal/servers/controller/handlers/authmethods/authmethod_service.go b/internal/servers/controller/handlers/authmethods/authmethod_service.go index 00ce454a0..25e4d916c 100644 --- a/internal/servers/controller/handlers/authmethods/authmethod_service.go +++ b/internal/servers/controller/handlers/authmethods/authmethod_service.go @@ -82,16 +82,16 @@ type Service struct { func NewService(kms *kms.Kms, pwRepoFn common.PasswordAuthRepoFactory, oidcRepoFn common.OidcAuthRepoFactory, iamRepoFn common.IamRepoFactory, atRepoFn common.AuthTokenRepoFactory, opt ...handlers.Option) (Service, error) { const op = "authmethods.NewService" if kms == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing kms") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing kms") } if pwRepoFn == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing password repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing password repository") } if oidcRepoFn == nil { return Service{}, fmt.Errorf("nil oidc repository provided") } if iamRepoFn == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing iam repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing iam repository") } if atRepoFn == nil { return Service{}, fmt.Errorf("nil auth token repository provided") @@ -205,7 +205,7 @@ func (s Service) GetAuthMethod(ctx context.Context, req *pbs.GetAuthMethodReques outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -236,7 +236,7 @@ func (s Service) GetAuthMethod(ctx context.Context, req *pbs.GetAuthMethodReques func (s Service) CreateAuthMethod(ctx context.Context, req *pbs.CreateAuthMethodRequest) (*pbs.CreateAuthMethodResponse, error) { const op = "authmethods.(Service).CreateAuthMethod" - if err := validateCreateRequest(req); err != nil { + if err := validateCreateRequest(ctx, req); err != nil { return nil, err } authResults := s.authResult(ctx, req.GetItem().GetScopeId(), action.Create) @@ -250,7 +250,7 @@ func (s Service) CreateAuthMethod(ctx context.Context, req *pbs.CreateAuthMethod outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -281,7 +281,7 @@ func (s Service) CreateAuthMethod(ctx context.Context, req *pbs.CreateAuthMethod func (s Service) UpdateAuthMethod(ctx context.Context, req *pbs.UpdateAuthMethodRequest) (*pbs.UpdateAuthMethodResponse, error) { const op = "authmethods.(Service).UpdateAuthMethod" - if err := validateUpdateRequest(req); err != nil { + if err := validateUpdateRequest(ctx, req); err != nil { return nil, err } authResults := s.authResult(ctx, req.GetId(), action.Update) @@ -300,7 +300,7 @@ func (s Service) UpdateAuthMethod(ctx context.Context, req *pbs.UpdateAuthMethod outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -354,7 +354,7 @@ func (s Service) ChangeState(ctx context.Context, req *pbs.ChangeStateRequest) ( outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -427,7 +427,7 @@ func (s Service) Authenticate(ctx context.Context, req *pbs.AuthenticateRequest) case oidc.Subtype: return s.authenticateOidc(ctx, req, &authResults) } - return nil, errors.New(errors.Internal, op, "Invalid auth method subtype not caught in validation function.") + return nil, errors.New(ctx, errors.Internal, op, "Invalid auth method subtype not caught in validation function.") } // Deprecated: use Authenticate @@ -491,18 +491,18 @@ func (s Service) listFromRepo(ctx context.Context, scopeIds []string, authResult const op = "authmethods.(Service).listFromRepo" reqCtx, ok := requests.RequestContextFromCtx(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } var outUl []auth.AuthMethod oidcRepo, err := s.oidcRepoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } ol, err := oidcRepo.ListAuthMethods(ctx, scopeIds, oidc.WithUnauthenticatedUser(reqCtx.UserId == requestauth.AnonymousUserId)) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } for _, item := range ol { outUl = append(outUl, item) @@ -510,11 +510,11 @@ func (s Service) listFromRepo(ctx context.Context, scopeIds []string, authResult repo, err := s.pwRepoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } pl, err := repo.ListAuthMethods(ctx, scopeIds) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } for _, item := range pl { outUl = append(outUl, item) @@ -529,7 +529,7 @@ func (s Service) createInRepo(ctx context.Context, scopeId string, item *pb.Auth case password.Subtype: am, err := s.createPwInRepo(ctx, scopeId, item) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if am == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to create auth method but no error returned from repository.") @@ -538,7 +538,7 @@ func (s Service) createInRepo(ctx context.Context, scopeId string, item *pb.Auth case oidc.Subtype: am, err := s.createOidcInRepo(ctx, scopeId, item) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if am == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to create auth method but no error returned from repository.") @@ -558,7 +558,7 @@ func (s Service) updateInRepo(ctx context.Context, scopeId string, req *pbs.Upda case password.Subtype: pam, err := s.updatePwInRepo(ctx, scopeId, req.GetId(), req.GetUpdateMask().GetPaths(), req.GetItem()) if err != nil { - return nil, false, errors.Wrap(err, op) + return nil, false, errors.Wrap(ctx, err, op) } if pam == nil { return nil, false, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to update auth method but no error returned from repository.") @@ -568,7 +568,7 @@ func (s Service) updateInRepo(ctx context.Context, scopeId string, req *pbs.Upda case oidc.Subtype: oam, dr, err := s.updateOidcInRepo(ctx, scopeId, req) if err != nil { - return nil, false, errors.Wrap(err, op) + return nil, false, errors.Wrap(ctx, err, op) } if oam == nil { return nil, false, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to update auth method but no error returned from repository.") @@ -588,14 +588,14 @@ func (s Service) deleteFromRepo(ctx context.Context, scopeId, id string) (bool, case password.Subtype: repo, err := s.pwRepoFn() if err != nil { - return false, errors.Wrap(err, op) + return false, errors.Wrap(ctx, err, op) } rows, dErr = repo.DeleteAuthMethod(ctx, scopeId, id) case oidc.Subtype: repo, err := s.oidcRepoFn() if err != nil { - return false, errors.Wrap(err, op) + return false, errors.Wrap(ctx, err, op) } rows, dErr = repo.DeleteAuthMethod(ctx, id) } @@ -604,7 +604,7 @@ func (s Service) deleteFromRepo(ctx context.Context, scopeId, id string) (bool, if errors.IsNotFoundError(dErr) { return false, nil } - return false, errors.Wrap(dErr, op, errors.WithMsg("unable to delete auth method")) + return false, errors.Wrap(ctx, dErr, op, errors.WithMsg("unable to delete auth method")) } return rows > 0, nil @@ -622,7 +622,7 @@ func (s Service) changeStateInRepo(ctx context.Context, req *pbs.ChangeStateRequ attrs := &pbs.OidcChangeStateAttributes{} if err := handlers.StructToProto(req.GetAttributes(), attrs); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to parse attributes")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to parse attributes")) } var opts []oidc.Option @@ -639,7 +639,7 @@ func (s Service) changeStateInRepo(ctx context.Context, req *pbs.ChangeStateRequ case publicState: am, err = repo.MakePublic(ctx, req.GetId(), req.GetVersion(), opts...) default: - err = errors.New(errors.InvalidParameter, op, fmt.Sprintf("unrecognized state %q", attrs.GetState())) + err = errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("unrecognized state %q", attrs.GetState())) } if err != nil { return nil, err @@ -648,7 +648,7 @@ func (s Service) changeStateInRepo(ctx context.Context, req *pbs.ChangeStateRequ return am, nil } - return nil, errors.New(errors.InvalidParameter, op, "Given auth method type does not support changing state") + return nil, errors.New(ctx, errors.InvalidParameter, op, "Given auth method type does not support changing state") } func (s Service) authResult(ctx context.Context, id string, a action.Type) requestauth.VerifyResults { @@ -710,7 +710,7 @@ func (s Service) authResult(ctx context.Context, id string, a action.Type) reque } authMeth = am default: - res.Error = errors.New(errors.InvalidPublicId, op, "unrecognized auth method type") + res.Error = errors.New(ctx, errors.InvalidPublicId, op, "unrecognized auth method type") return res } parentId = authMeth.GetScopeId() @@ -843,15 +843,15 @@ func toAuthTokenProto(t *authtoken.AuthToken) *pba.AuthToken { func validateGetRequest(req *pbs.GetAuthMethodRequest) error { const op = "authmethod.validateGetRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "Missing request") + return errors.NewDeprecated(errors.InvalidParameter, op, "Missing request") } return handlers.ValidateGetRequest(handlers.NoopValidatorFn, req, password.AuthMethodPrefix, oidc.AuthMethodPrefix) } -func validateCreateRequest(req *pbs.CreateAuthMethodRequest) error { +func validateCreateRequest(ctx context.Context, req *pbs.CreateAuthMethodRequest) error { const op = "authmethod.validateCreateRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "Missing request") + return errors.NewDeprecated(errors.InvalidParameter, op, "Missing request") } return handlers.ValidateCreateRequest(req.GetItem(), func() map[string]string { badFields := map[string]string{} @@ -917,7 +917,7 @@ func validateCreateRequest(req *pbs.CreateAuthMethodRequest) error { } } if len(attrs.GetIdpCaCerts()) > 0 { - if _, err := oidc.ParseCertificates(attrs.GetIdpCaCerts()...); err != nil { + if _, err := oidc.ParseCertificates(ctx, attrs.GetIdpCaCerts()...); err != nil { badFields[idpCaCertsField] = fmt.Sprintf("Cannot parse CA certificates. %v", err.Error()) } } @@ -930,7 +930,7 @@ func validateCreateRequest(req *pbs.CreateAuthMethodRequest) error { } } if len(attrs.GetAccountClaimMaps()) > 0 { - acm, err := oidc.ParseAccountClaimMaps(attrs.GetAccountClaimMaps()...) + acm, err := oidc.ParseAccountClaimMaps(ctx, attrs.GetAccountClaimMaps()...) if err != nil { badFields[accountClaimMapsField] = fmt.Sprintf("Contains invalid map %q", err.Error()) } @@ -950,10 +950,10 @@ func validateCreateRequest(req *pbs.CreateAuthMethodRequest) error { }) } -func validateUpdateRequest(req *pbs.UpdateAuthMethodRequest) error { +func validateUpdateRequest(ctx context.Context, req *pbs.UpdateAuthMethodRequest) error { const op = "authmethod.validateUpdateRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "missing request") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing request") } return handlers.ValidateUpdateRequest(req, req.GetItem(), func() map[string]string { badFields := map[string]string{} @@ -1038,7 +1038,7 @@ func validateUpdateRequest(req *pbs.UpdateAuthMethodRequest) error { } } if len(attrs.GetIdpCaCerts()) > 0 { - if _, err := oidc.ParseCertificates(attrs.GetIdpCaCerts()...); err != nil { + if _, err := oidc.ParseCertificates(ctx, attrs.GetIdpCaCerts()...); err != nil { badFields[idpCaCertsField] = fmt.Sprintf("Cannot parse CA certificates. %v", err.Error()) } } @@ -1051,7 +1051,7 @@ func validateUpdateRequest(req *pbs.UpdateAuthMethodRequest) error { } } if len(attrs.GetAccountClaimMaps()) > 0 { - acm, err := oidc.ParseAccountClaimMaps(attrs.GetAccountClaimMaps()...) + acm, err := oidc.ParseAccountClaimMaps(ctx, attrs.GetAccountClaimMaps()...) if err != nil { badFields[accountClaimMapsField] = fmt.Sprintf("Contains invalid map %q", err.Error()) } else { @@ -1062,7 +1062,7 @@ func validateUpdateRequest(req *pbs.UpdateAuthMethodRequest) error { } foundTo[m.To] = true - to, err := oidc.ConvertToAccountToClaim(m.To) + to, err := oidc.ConvertToAccountToClaim(ctx, m.To) if err != nil { badFields[accountClaimMapsField] = fmt.Sprintf("%s=%s contains invalid map %q", m.From, m.To, err.Error()) break @@ -1084,7 +1084,7 @@ func validateUpdateRequest(req *pbs.UpdateAuthMethodRequest) error { func validateDeleteRequest(req *pbs.DeleteAuthMethodRequest) error { const op = "authmethod.validateDeleteRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "Missing request") + return errors.NewDeprecated(errors.InvalidParameter, op, "Missing request") } return handlers.ValidateDeleteRequest(handlers.NoopValidatorFn, req, password.AuthMethodPrefix, oidc.AuthMethodPrefix) } @@ -1092,7 +1092,7 @@ func validateDeleteRequest(req *pbs.DeleteAuthMethodRequest) error { func validateListRequest(req *pbs.ListAuthMethodsRequest) error { const op = "authmethod.validateListRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "Missing request") + return errors.NewDeprecated(errors.InvalidParameter, op, "Missing request") } badFields := map[string]string{} if !handlers.ValidId(handlers.Id(req.GetScopeId()), scope.Org.Prefix()) && @@ -1111,7 +1111,7 @@ func validateListRequest(req *pbs.ListAuthMethodsRequest) error { func validateChangeStateRequest(req *pbs.ChangeStateRequest) error { const op = "authmethod.validateChangeStateRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "Missing request") + return errors.NewDeprecated(errors.InvalidParameter, op, "Missing request") } if st := auth.SubtypeFromId(req.GetId()); st != oidc.Subtype { return handlers.NotFoundErrorf("This endpoint is only available for the %q Auth Method type.", oidc.Subtype.String()) @@ -1139,7 +1139,7 @@ func validateChangeStateRequest(req *pbs.ChangeStateRequest) error { func validateAuthenticateRequest(req *pbs.AuthenticateRequest) error { const op = "authmethod.validateAuthenticateRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "Missing request") + return errors.NewDeprecated(errors.InvalidParameter, op, "Missing request") } badFields := make(map[string]string) @@ -1166,7 +1166,7 @@ func validateAuthenticateRequest(req *pbs.AuthenticateRequest) error { func validateAuthenticateLoginRequest(req *pbs.AuthenticateLoginRequest) error { const op = "authmethod.validateAuthenticateLoginRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "Missing request") + return errors.NewDeprecated(errors.InvalidParameter, op, "Missing request") } badFields := make(map[string]string) if strings.TrimSpace(req.GetAuthMethodId()) == "" { @@ -1201,16 +1201,16 @@ func (s Service) ConvertInternalAuthTokenToApiAuthToken(ctx context.Context, tok return nil, err } if tok == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing auth token.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing auth token.") } if tok.Token == "" { - return nil, errors.New(errors.InvalidParameter, op, "Empty token.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "Empty token.") } if tok.GetPublicId() == "" { - return nil, errors.New(errors.InvalidParameter, op, "Empty token public ID.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "Empty token public ID.") } if tok.GetScopeId() == "" { - return nil, errors.New(errors.InvalidParameter, op, "Empty token, scope ID.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "Empty token, scope ID.") } token, err := authtoken.EncryptToken(ctx, s.kms, tok.GetScopeId(), tok.GetPublicId(), tok.GetToken()) if err != nil { @@ -1239,19 +1239,19 @@ func (s Service) ConvertInternalAuthTokenToApiAuthToken(ctx context.Context, tok func (s Service) convertToAuthenticateResponse(ctx context.Context, req *pbs.AuthenticateRequest, authResults *requestauth.VerifyResults, tok *pba.AuthToken) (*pbs.AuthenticateResponse, error) { const op = "authmethod.convertToAuthenticateResponse" if req == nil { - return nil, errors.New(errors.InvalidParameter, op, "Missing request.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "Missing request.") } if authResults == nil { - return nil, errors.New(errors.InvalidParameter, op, "Missing auth results.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "Missing auth results.") } if authResults.Scope == nil { - return nil, errors.New(errors.InvalidParameter, op, "Missing auth results scope.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "Missing auth results scope.") } if authResults.Scope.Id == "" { - return nil, errors.New(errors.InvalidParameter, op, "Missing auth results scope ID.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "Missing auth results scope ID.") } if tok == nil { - return nil, errors.New(errors.InvalidParameter, op, "Missing auth token.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "Missing auth token.") } res := &perms.Resource{ ScopeId: authResults.Scope.Id, diff --git a/internal/servers/controller/handlers/authmethods/authmethod_service_test.go b/internal/servers/controller/handlers/authmethods/authmethod_service_test.go index 71ef19e3d..fdc4df345 100644 --- a/internal/servers/controller/handlers/authmethods/authmethod_service_test.go +++ b/internal/servers/controller/handlers/authmethods/authmethod_service_test.go @@ -67,6 +67,7 @@ var authorizedCollectionActions = map[string]*structpb.ListValue{ } func TestGet(t *testing.T) { + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -75,7 +76,7 @@ func TestGet(t *testing.T) { return iam.TestRepo(t, conn, wrapper), nil } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kmsCache) + return oidc.NewRepository(ctx, rw, rw, kmsCache) } pwRepoFn := func() (*password.Repository, error) { return password.NewRepository(rw, rw, kmsCache) @@ -204,6 +205,7 @@ func TestGet(t *testing.T) { } func TestList(t *testing.T) { + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -212,7 +214,7 @@ func TestList(t *testing.T) { return iam.TestRepo(t, conn, wrapper), nil } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kmsCache) + return oidc.NewRepository(ctx, rw, rw, kmsCache) } pwRepoFn := func() (*password.Repository, error) { return password.NewRepository(rw, rw, kmsCache) @@ -385,6 +387,7 @@ func TestList(t *testing.T) { } func TestDelete(t *testing.T) { + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -393,7 +396,7 @@ func TestDelete(t *testing.T) { return iam.TestRepo(t, conn, wrapper), nil } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kmsCache) + return oidc.NewRepository(ctx, rw, rw, kmsCache) } pwRepoFn := func() (*password.Repository, error) { return password.NewRepository(rw, rw, kmsCache) @@ -461,6 +464,7 @@ func TestDelete(t *testing.T) { } func TestDelete_twice(t *testing.T) { + ctx := context.TODO() assert, require := assert.New(t), require.New(t) conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) @@ -470,7 +474,7 @@ func TestDelete_twice(t *testing.T) { return iam.TestRepo(t, conn, wrapper), nil } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kms) + return oidc.NewRepository(ctx, rw, rw, kms) } pwRepoFn := func() (*password.Repository, error) { return password.NewRepository(rw, rw, kms) @@ -497,6 +501,7 @@ func TestDelete_twice(t *testing.T) { } func TestCreate(t *testing.T) { + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -508,7 +513,7 @@ func TestCreate(t *testing.T) { return password.NewRepository(rw, rw, kms) } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kms) + return oidc.NewRepository(ctx, rw, rw, kms) } atRepoFn := func() (*authtoken.Repository, error) { return authtoken.NewRepository(rw, rw, kms) diff --git a/internal/servers/controller/handlers/authmethods/oidc.go b/internal/servers/controller/handlers/authmethods/oidc.go index a127e0e4e..004f4f10b 100644 --- a/internal/servers/controller/handlers/authmethods/oidc.go +++ b/internal/servers/controller/handlers/authmethods/oidc.go @@ -91,7 +91,7 @@ func (o oidcState) String() string { // createOidcInRepo creates an oidc auth method in a repo and returns the result. // This method should never return a nil AuthMethod without returning an error. func (s Service) createOidcInRepo(ctx context.Context, scopeId string, item *pb.AuthMethod) (*oidc.AuthMethod, error) { - u, _, _, err := toStorageOidcAuthMethod(scopeId, item) + u, _, _, err := toStorageOidcAuthMethod(ctx, scopeId, item) if err != nil { return nil, err } @@ -108,7 +108,7 @@ func (s Service) createOidcInRepo(ctx context.Context, scopeId string, item *pb. func (s Service) updateOidcInRepo(ctx context.Context, scopeId string, req *pbs.UpdateAuthMethodRequest) (*oidc.AuthMethod, bool, error) { item := req.GetItem() - u, dryRun, forced, err := toStorageOidcAuthMethod(scopeId, item) + u, dryRun, forced, err := toStorageOidcAuthMethod(ctx, scopeId, item) if err != nil { return nil, dryRun, err } @@ -145,10 +145,10 @@ func (s Service) updateOidcInRepo(ctx context.Context, scopeId string, req *pbs. func (s Service) authenticateOidc(ctx context.Context, req *pbs.AuthenticateRequest, authResults *auth.VerifyResults) (*pbs.AuthenticateResponse, error) { const op = "authmethod_service.(Service).authenticateOidc" if req == nil { - return nil, errors.New(errors.InvalidParameter, op, "Nil request.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "Nil request.") } if authResults == nil { - return nil, errors.New(errors.InvalidParameter, op, "Nil auth results.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "Nil auth results.") } switch req.GetCommand() { case startCommand: @@ -165,13 +165,13 @@ func (s Service) authenticateOidc(ctx context.Context, req *pbs.AuthenticateRequ func (s Service) authenticateOidcStart(ctx context.Context, req *pbs.AuthenticateRequest) (*pbs.AuthenticateResponse, error) { const op = "authmethod_service.(Service).authenticateOidcStart" if req == nil { - return nil, errors.New(errors.InvalidParameter, op, "Nil request.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "Nil request.") } var opts []oidc.Option attrs := new(pbs.OidcStartAttributes) if err := handlers.StructToProto(req.GetAttributes(), attrs); err != nil { - return nil, errors.New(errors.InvalidParameter, op, "Error parsing request attributes.", errors.WithWrap(err)) + return nil, errors.New(ctx, errors.InvalidParameter, op, "Error parsing request attributes.", errors.WithWrap(err)) } if attrs.GetCachedRoundtripPayload() != "" { opts = append(opts, oidc.WithRoundtripPayload(attrs.GetCachedRoundtripPayload())) @@ -182,7 +182,7 @@ func (s Service) authenticateOidcStart(ctx context.Context, req *pbs.Authenticat // this event.WriteError(...) may cause a dup error to be emitted... // it should be removed if that's the case. event.WriteError(ctx, op, err, event.WithInfoMsg("error starting the oidc authentication flow")) - return nil, errors.New(errors.Internal, op, "Error generating parameters for starting the OIDC flow. See the controller's log for more information.") + return nil, errors.New(ctx, errors.Internal, op, "Error generating parameters for starting the OIDC flow. See the controller's log for more information.") } respAttrs := &pb.OidcAuthMethodAuthenticateStartResponse{ @@ -191,7 +191,7 @@ func (s Service) authenticateOidcStart(ctx context.Context, req *pbs.Authenticat } resp := &pbs.AuthenticateResponse{Command: req.GetCommand()} if resp.Attributes, err = handlers.ProtoToStruct(respAttrs); err != nil { - return nil, errors.New(errors.Internal, op, "Error marshaling parameters.", errors.WithWrap(err)) + return nil, errors.New(ctx, errors.Internal, op, "Error marshaling parameters.", errors.WithWrap(err)) } return resp, nil } @@ -208,22 +208,22 @@ func (s Service) authenticateOidcCallback(ctx context.Context, req *pbs.Authenti // in the redirect URL once we start looking at the url used for this // request instead of requiring the API URL to be set on the auth method. if req == nil { - return nil, errors.New(errors.InvalidParameter, op, "Nil request.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "Nil request.") } repo, err := s.oidcRepoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } am, err := repo.LookupAuthMethod(ctx, req.GetAuthMethodId()) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if am == nil { - return nil, errors.New(errors.RecordNotFound, op, fmt.Sprintf("Auth method %s not found.", req.GetAuthMethodId())) + return nil, errors.New(ctx, errors.RecordNotFound, op, fmt.Sprintf("Auth method %s not found.", req.GetAuthMethodId())) } if am.GetApiUrl() == "" { - return nil, errors.New(errors.InvalidParameter, op, "Auth method doesn't have API URL defined.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "Auth method doesn't have API URL defined.") } errRedirectBase := fmt.Sprintf(oidc.AuthenticationErrorsEndpoint, am.GetApiUrl()) @@ -232,7 +232,7 @@ func (s Service) authenticateOidcCallback(ctx context.Context, req *pbs.Authenti pbErr := handlers.ToApiError(err) out, err := handlers.JSONMarshaler().Marshal(pbErr) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to marshal the error for callback")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to marshal the error for callback")) } u.Add("error", string(out)) errRedirect := fmt.Sprintf("%s?%s", errRedirectBase, u.Encode()) @@ -240,7 +240,7 @@ func (s Service) authenticateOidcCallback(ctx context.Context, req *pbs.Authenti FinalRedirectUrl: errRedirect, }) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("failed creating error redirect response")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("failed creating error redirect response")) } return &pbs.AuthenticateResponse{Command: callbackCommand, Attributes: respAttrs}, nil } @@ -253,7 +253,7 @@ func (s Service) authenticateOidcCallback(ctx context.Context, req *pbs.Authenti var finalRedirectUrl string if attrs.GetError() != "" { - err := errors.Wrap(fmt.Errorf("Error: %q, Details: %q", attrs.GetError(), attrs.GetErrorDescription()), op, errors.WithCode(errors.OidcProviderCallbackError)) + err := errors.Wrap(ctx, fmt.Errorf("Error: %q, Details: %q", attrs.GetError(), attrs.GetErrorDescription()), op, errors.WithCode(errors.OidcProviderCallbackError)) return errResponse(err) } finalRedirectUrl, err = oidc.Callback( @@ -265,14 +265,14 @@ func (s Service) authenticateOidcCallback(ctx context.Context, req *pbs.Authenti attrs.GetState(), attrs.GetCode()) if err != nil { - return errResponse(errors.New(errors.InvalidParameter, op, "Callback validation failed.", errors.WithWrap(err))) + return errResponse(errors.New(ctx, errors.InvalidParameter, op, "Callback validation failed.", errors.WithWrap(err))) } respAttrs, err := handlers.ProtoToStruct(&pb.OidcAuthMethodAuthenticateCallbackResponse{ FinalRedirectUrl: finalRedirectUrl, }) if err != nil { - return errResponse(errors.New(errors.Internal, op, "Error marshaling parameters after successful callback", errors.WithWrap(err))) + return errResponse(errors.New(ctx, errors.Internal, op, "Error marshaling parameters after successful callback", errors.WithWrap(err))) } return &pbs.AuthenticateResponse{Command: req.GetCommand(), Attributes: respAttrs}, nil @@ -281,35 +281,35 @@ func (s Service) authenticateOidcCallback(ctx context.Context, req *pbs.Authenti func (s Service) authenticateOidcToken(ctx context.Context, req *pbs.AuthenticateRequest, authResults *auth.VerifyResults) (*pbs.AuthenticateResponse, error) { const op = "authmethod_service.(Service).authenticateOidcToken" if req == nil { - return nil, errors.New(errors.InvalidParameter, op, "Nil request.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "Nil request.") } if authResults == nil { - return nil, errors.New(errors.InvalidParameter, op, "Nil auth results.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "Nil auth results.") } if req.GetAttributes() == nil { - return nil, errors.New(errors.InvalidParameter, op, "Nil request attributes.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "Nil request attributes.") } attrs := new(pb.OidcAuthMethodAuthenticateTokenRequest) if err := handlers.StructToProto(req.GetAttributes(), attrs); err != nil { - return nil, errors.New(errors.InvalidParameter, op, "Error parsing request attributes.", errors.WithWrap(err)) + return nil, errors.New(ctx, errors.InvalidParameter, op, "Error parsing request attributes.", errors.WithWrap(err)) } if attrs.TokenId == "" { - return nil, errors.New(errors.InvalidParameter, op, "Empty token ID in request attributes.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "Empty token ID in request attributes.") } token, err := oidc.TokenRequest(ctx, s.kms, s.atRepoFn, req.GetAuthMethodId(), attrs.TokenId) if err != nil { switch { case errors.Match(errors.T(errors.Forbidden), err): - return nil, errors.Wrap(err, op, errors.WithMsg("Forbidden.")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("Forbidden.")) case errors.Match(errors.T(errors.AuthAttemptExpired), err): - return nil, errors.Wrap(err, op, errors.WithMsg("Forbidden.")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("Forbidden.")) default: // this event.WriteError(...) may cause a dup error to be emitted... // it should be removed if that's the case. event.WriteError(ctx, op, err, event.WithInfoMsg("error generating parameters for token request")) - return nil, errors.Wrap(err, op, errors.WithMsg("Error generating parameters for token request. See the controller's log for more information.")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("Error generating parameters for token request. See the controller's log for more information.")) } } if token == nil { @@ -317,7 +317,7 @@ func (s Service) authenticateOidcToken(ctx context.Context, req *pbs.Authenticat statusField: "unknown", }) if err != nil { - return nil, errors.New(errors.Internal, op, "Error generating response attributes.", errors.WithWrap(err)) + return nil, errors.New(ctx, errors.Internal, op, "Error generating response attributes.", errors.WithWrap(err)) } return &pbs.AuthenticateResponse{ Command: req.Command, @@ -330,7 +330,7 @@ func (s Service) authenticateOidcToken(ctx context.Context, req *pbs.Authenticat token, ) if err != nil { - return nil, errors.New(errors.Internal, op, "Error converting response to proper format.", errors.WithWrap(err)) + return nil, errors.New(ctx, errors.Internal, op, "Error converting response to proper format.", errors.WithWrap(err)) } return s.convertToAuthenticateResponse(ctx, req, authResults, responseToken) } @@ -404,10 +404,10 @@ func validateAuthenticateOidcRequest(req *pbs.AuthenticateRequest) error { return nil } -func toStorageOidcAuthMethod(scopeId string, in *pb.AuthMethod) (out *oidc.AuthMethod, dryRun, forced bool, err error) { +func toStorageOidcAuthMethod(ctx context.Context, scopeId string, in *pb.AuthMethod) (out *oidc.AuthMethod, dryRun, forced bool, err error) { const op = "authmethod_service.toStorageOidcAuthMethod" if in == nil { - return nil, false, false, errors.New(errors.InvalidParameter, op, "nil auth method.") + return nil, false, false, errors.NewDeprecated(errors.InvalidParameter, op, "nil auth method.") } attrs := &pb.OidcAuthMethodAttributes{} if err := handlers.StructToProto(in.GetAttributes(), attrs); err != nil { @@ -431,14 +431,14 @@ func toStorageOidcAuthMethod(scopeId string, in *pb.AuthMethod) (out *oidc.AuthM iss = strings.SplitN(iss, ".well-known/", 2)[0] issuer, err := url.Parse(iss) if err != nil { - return nil, false, false, errors.Wrap(err, op, errors.WithMsg("cannot parse issuer"), errors.WithCode(errors.InvalidParameter)) + return nil, false, false, errors.WrapDeprecated(err, op, errors.WithMsg("cannot parse issuer"), errors.WithCode(errors.InvalidParameter)) } opts = append(opts, oidc.WithIssuer(issuer)) } if apiUrl := strings.TrimSpace(attrs.GetApiUrlPrefix().GetValue()); apiUrl != "" { apiU, err := url.Parse(apiUrl) if err != nil { - return nil, false, false, errors.Wrap(err, op, errors.WithMsg("cannot parse api_url_prefix"), errors.WithCode(errors.InvalidParameter)) + return nil, false, false, errors.WrapDeprecated(err, op, errors.WithMsg("cannot parse api_url_prefix"), errors.WithCode(errors.InvalidParameter)) } opts = append(opts, oidc.WithApiUrl(apiU)) } @@ -463,7 +463,7 @@ func toStorageOidcAuthMethod(scopeId string, in *pb.AuthMethod) (out *oidc.AuthM } if len(attrs.GetIdpCaCerts()) > 0 { - certs, err := oidc.ParseCertificates(attrs.GetIdpCaCerts()...) + certs, err := oidc.ParseCertificates(ctx, attrs.GetIdpCaCerts()...) if err != nil { return nil, false, false, err } @@ -477,26 +477,26 @@ func toStorageOidcAuthMethod(scopeId string, in *pb.AuthMethod) (out *oidc.AuthM if len(attrs.GetAccountClaimMaps()) > 0 { claimsMap := make(map[string]oidc.AccountToClaim, len(attrs.GetAccountClaimMaps())) for _, v := range attrs.GetAccountClaimMaps() { - acm, err := oidc.ParseAccountClaimMaps(v) + acm, err := oidc.ParseAccountClaimMaps(ctx, v) if err != nil { - return nil, false, false, errors.Wrap(err, op) + return nil, false, false, errors.WrapDeprecated(err, op) } if len(acm) > 1 { - return nil, false, false, errors.New(errors.InvalidParameter, op, fmt.Sprintf("unable to parse account claim map %s", v)) + return nil, false, false, errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("unable to parse account claim map %s", v)) } var m oidc.ClaimMap for _, m = range acm { } - to, err := oidc.ConvertToAccountToClaim(m.To) + to, err := oidc.ConvertToAccountToClaim(ctx, m.To) if err != nil { - return nil, false, false, errors.Wrap(err, op) + return nil, false, false, errors.WrapDeprecated(err, op) } claimsMap[m.From] = to } opts = append(opts, oidc.WithAccountClaimMap(claimsMap)) } - u, err := oidc.NewAuthMethod(scopeId, clientId, clientSecret, opts...) + u, err := oidc.NewAuthMethod(ctx, scopeId, clientId, clientSecret, opts...) if err != nil { return nil, false, false, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to build auth method: %v.", err) } diff --git a/internal/servers/controller/handlers/authmethods/oidc_test.go b/internal/servers/controller/handlers/authmethods/oidc_test.go index e9c98c5fb..166521348 100644 --- a/internal/servers/controller/handlers/authmethods/oidc_test.go +++ b/internal/servers/controller/handlers/authmethods/oidc_test.go @@ -69,6 +69,7 @@ type setup struct { func getSetup(t *testing.T) setup { t.Helper() + ctx := context.TODO() require := require.New(t) var ret setup var err error @@ -84,7 +85,7 @@ func getSetup(t *testing.T) setup { return ret.iamRepo, nil } ret.oidcRepoFn = func() (*oidc.Repository, error) { - return oidc.NewRepository(ret.rw, ret.rw, ret.kmsCache) + return oidc.NewRepository(ctx, ret.rw, ret.rw, ret.kmsCache) } ret.pwRepoFn = func() (*password.Repository, error) { return password.NewRepository(ret.rw, ret.rw, ret.kmsCache) @@ -102,7 +103,7 @@ func getSetup(t *testing.T) setup { ret.testProvider = capoidc.StartTestProvider(t) _, _, ret.testProviderAlg, _ = ret.testProvider.SigningKeys() - ret.testProviderCaCert, err = oidc.ParseCertificates(ret.testProvider.CACert()) + ret.testProviderCaCert, err = oidc.ParseCertificates(ctx, ret.testProvider.CACert()) require.NoError(err) ret.testController = httptest.NewTLSServer(http.HandlerFunc(func(w http.ResponseWriter, req *http.Request) { @@ -132,6 +133,7 @@ func getSetup(t *testing.T) setup { } func TestList_FilterNonPublic(t *testing.T) { + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -140,7 +142,7 @@ func TestList_FilterNonPublic(t *testing.T) { return iam.TestRepo(t, conn, wrapper), nil } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kmsCache) + return oidc.NewRepository(ctx, rw, rw, kmsCache) } pwRepoFn := func() (*password.Repository, error) { return password.NewRepository(rw, rw, kmsCache) @@ -234,6 +236,7 @@ func TestList_FilterNonPublic(t *testing.T) { } func TestUpdate_OIDC(t *testing.T) { + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -242,7 +245,7 @@ func TestUpdate_OIDC(t *testing.T) { return iam.TestRepo(t, conn, wrapper), nil } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kms) + return oidc.NewRepository(ctx, rw, rw, kms) } pwRepoFn := func() (*password.Repository, error) { return password.NewRepository(rw, rw, kms) @@ -1120,6 +1123,7 @@ func TestUpdate_OIDC(t *testing.T) { } func TestUpdate_OIDCDryRun(t *testing.T) { + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -1128,7 +1132,7 @@ func TestUpdate_OIDCDryRun(t *testing.T) { return iam.TestRepo(t, conn, wrapper), nil } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kmsCache) + return oidc.NewRepository(ctx, rw, rw, kmsCache) } pwRepoFn := func() (*password.Repository, error) { return password.NewRepository(rw, rw, kmsCache) @@ -1146,7 +1150,7 @@ func TestUpdate_OIDCDryRun(t *testing.T) { tp.SetClientCreds(tpClientId, tpClientSecret) _, _, tpAlg, _ := tp.SigningKeys() - tpCert, err := oidc.ParseCertificates(tp.CACert()) + tpCert, err := oidc.ParseCertificates(ctx, tp.CACert()) require.NoError(t, err) databaseWrapper, err := kmsCache.GetWrapper(context.Background(), o.PublicId, kms.KeyPurposeDatabase) require.NoError(t, err) @@ -1294,6 +1298,7 @@ func TestUpdate_OIDCDryRun(t *testing.T) { } func TestChangeState_OIDC(t *testing.T) { + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -1302,7 +1307,7 @@ func TestChangeState_OIDC(t *testing.T) { return iam.TestRepo(t, conn, wrapper), nil } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kmsCache) + return oidc.NewRepository(ctx, rw, rw, kmsCache) } pwRepoFn := func() (*password.Repository, error) { return password.NewRepository(rw, rw, kmsCache) @@ -1323,7 +1328,7 @@ func TestChangeState_OIDC(t *testing.T) { tpClientSecret := "her-dog's-name" tp.SetClientCreds(tpClientId, tpClientSecret) _, _, tpAlg, _ := tp.SigningKeys() - tpCert, err := oidc.ParseCertificates(tp.CACert()) + tpCert, err := oidc.ParseCertificates(ctx, tp.CACert()) require.NoError(t, err) incompleteAm := oidc.TestAuthMethod(t, conn, databaseWrapper, o.PublicId, "inactive", "client id", "secret", diff --git a/internal/servers/controller/handlers/authmethods/password.go b/internal/servers/controller/handlers/authmethods/password.go index 00f8fa4d1..3bcefe4bb 100644 --- a/internal/servers/controller/handlers/authmethods/password.go +++ b/internal/servers/controller/handlers/authmethods/password.go @@ -174,7 +174,7 @@ func validateAuthenticatePasswordRequest(req *pbs.AuthenticateRequest) error { func toStoragePwAuthMethod(scopeId string, item *pb.AuthMethod) (*password.AuthMethod, error) { const op = "authmethod_service.toStoragePwAuthMethod" if item == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil auth method.") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil auth method.") } var opts []password.Option if item.GetName() != nil { diff --git a/internal/servers/controller/handlers/authmethods/password_test.go b/internal/servers/controller/handlers/authmethods/password_test.go index 553070e40..517ccff94 100644 --- a/internal/servers/controller/handlers/authmethods/password_test.go +++ b/internal/servers/controller/handlers/authmethods/password_test.go @@ -32,6 +32,7 @@ import ( ) func TestUpdate_Password(t *testing.T) { + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -40,7 +41,7 @@ func TestUpdate_Password(t *testing.T) { return iam.TestRepo(t, conn, wrapper), nil } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kms) + return oidc.NewRepository(ctx, rw, rw, kms) } pwRepoFn := func() (*password.Repository, error) { return password.NewRepository(rw, rw, kms) @@ -447,6 +448,7 @@ func TestUpdate_Password(t *testing.T) { } func TestAuthenticate_Password(t *testing.T) { + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -457,7 +459,7 @@ func TestAuthenticate_Password(t *testing.T) { return iam.TestRepo(t, conn, wrapper), nil } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kms) + return oidc.NewRepository(ctx, rw, rw, kms) } pwRepoFn := func() (*password.Repository, error) { return password.NewRepository(rw, rw, kms) @@ -616,6 +618,7 @@ func TestAuthenticate_Password(t *testing.T) { } func TestAuthenticateLogin_Password(t *testing.T) { + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrapper := db.TestWrapper(t) @@ -626,7 +629,7 @@ func TestAuthenticateLogin_Password(t *testing.T) { return iam.TestRepo(t, conn, wrapper), nil } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kms) + return oidc.NewRepository(ctx, rw, rw, kms) } pwRepoFn := func() (*password.Repository, error) { return password.NewRepository(rw, rw, kms) @@ -784,6 +787,7 @@ func TestAuthenticateLogin_Password(t *testing.T) { } func TestAuthenticate_AuthAccountConnectedToIamUser_Password(t *testing.T) { + ctx := context.TODO() assert, require := assert.New(t), require.New(t) conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) @@ -795,7 +799,7 @@ func TestAuthenticate_AuthAccountConnectedToIamUser_Password(t *testing.T) { return iam.TestRepo(t, conn, wrapper), nil } oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kms) + return oidc.NewRepository(ctx, rw, rw, kms) } pwRepoFn := func() (*password.Repository, error) { return password.NewRepository(rw, rw, kms) diff --git a/internal/servers/controller/handlers/authtokens/authtoken_service.go b/internal/servers/controller/handlers/authtokens/authtoken_service.go index d1ff75a41..25b65e1dc 100644 --- a/internal/servers/controller/handlers/authtokens/authtoken_service.go +++ b/internal/servers/controller/handlers/authtokens/authtoken_service.go @@ -51,10 +51,10 @@ type Service struct { func NewService(repo common.AuthTokenRepoFactory, iamRepoFn common.IamRepoFactory) (Service, error) { const op = "authtoken.NewService" if repo == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing auth token repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing auth token repository") } if iamRepoFn == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing iam repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing iam repository") } return Service{repoFn: repo, iamRepoFn: iamRepoFn}, nil } @@ -173,7 +173,7 @@ func (s Service) GetAuthToken(ctx context.Context, req *pbs.GetAuthTokenRequest) var ok bool outputFields, ok = requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } } @@ -229,14 +229,14 @@ func (s Service) getFromRepo(ctx context.Context, id string) (*authtoken.AuthTok const op = "authtokens.(Service).getFromRepo" repo, err := s.repoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } at, err := repo.LookupAuthToken(ctx, id) if err != nil && !errors.IsNotFoundError(err) { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if at == nil { - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("AuthToken %q not found", id)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("AuthToken %q not found", id)) } return at, nil } @@ -245,14 +245,14 @@ func (s Service) deleteFromRepo(ctx context.Context, id string) (bool, error) { const op = "authtokens.(Service).deleteFromRepo" repo, err := s.repoFn() if err != nil { - return false, errors.Wrap(err, op) + return false, errors.Wrap(ctx, err, op) } rows, err := repo.DeleteAuthToken(ctx, id) if err != nil { if errors.IsNotFoundError(err) { return false, nil } - return false, errors.Wrap(err, op, errors.WithMsg("unable to delete user")) + return false, errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete user")) } return rows > 0, nil } diff --git a/internal/servers/controller/handlers/credentiallibraries/credentiallibrary_service.go b/internal/servers/controller/handlers/credentiallibraries/credentiallibrary_service.go index a208d194a..73ee62ace 100644 --- a/internal/servers/controller/handlers/credentiallibraries/credentiallibrary_service.go +++ b/internal/servers/controller/handlers/credentiallibraries/credentiallibrary_service.go @@ -70,10 +70,10 @@ type Service struct { func NewService(repo common.VaultCredentialRepoFactory, iamRepo common.IamRepoFactory) (Service, error) { const op = "credentiallibraries.NewService" if iamRepo == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing iam repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing iam repository") } if repo == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing vault credential repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing vault credential repository") } return Service{iamRepoFn: iamRepo, repoFn: repo}, nil } @@ -155,7 +155,7 @@ func (s Service) GetCredentialLibrary(ctx context.Context, req *pbs.GetCredentia outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -193,7 +193,7 @@ func (s Service) CreateCredentialLibrary(ctx context.Context, req *pbs.CreateCre outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -234,7 +234,7 @@ func (s Service) UpdateCredentialLibrary(ctx context.Context, req *pbs.UpdateCre outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -274,11 +274,11 @@ func (s Service) listFromRepo(ctx context.Context, storeId string) ([]*vault.Cre const op = "credentiallibraries.(Service).listFromRepo" repo, err := s.repoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } csl, err := repo.ListCredentialLibraries(ctx, storeId) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return csl, nil } @@ -287,14 +287,14 @@ func (s Service) getFromRepo(ctx context.Context, id string) (credential.Library const op = "credentiallibraries.(Service).getFromRepo" repo, err := s.repoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } cs, err := repo.LookupCredentialLibrary(ctx, id) if err != nil && !errors.IsNotFoundError(err) { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if cs == nil { - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("credential library %q not found", id)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("credential library %q not found", id)) } return cs, err } @@ -303,15 +303,15 @@ func (s Service) createInRepo(ctx context.Context, scopeId string, item *pb.Cred const op = "credentiallibraries.(Service).createInRepo" cl, err := toStorageVaultLibrary(item.GetCredentialStoreId(), item) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } repo, err := s.repoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } out, err := repo.CreateCredentialLibrary(ctx, scopeId, cl) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create credential library")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create credential library")) } if out == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to create credential library but no error returned from repository.") @@ -323,7 +323,7 @@ func (s Service) updateInRepo(ctx context.Context, projId, id string, mask []str const op = "credentiallibraries.(Service).updateInRepo" cl, err := toStorageVaultLibrary(item.GetCredentialStoreId(), item) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } cl.PublicId = id @@ -333,11 +333,11 @@ func (s Service) updateInRepo(ctx context.Context, projId, id string, mask []str } repo, err := s.repoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } out, rowsUpdated, err := repo.UpdateCredentialLibrary(ctx, projId, cl, item.GetVersion(), dbMask) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to update credential library")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to update credential library")) } if rowsUpdated == 0 { return nil, handlers.NotFoundErrorf("Credential Library %q doesn't exist or incorrect version provided.", id) @@ -356,7 +356,7 @@ func (s Service) deleteFromRepo(ctx context.Context, scopeId, id string) (bool, if errors.IsNotFoundError(err) { return false, nil } - return false, errors.Wrap(err, op, errors.WithMsg("unable to delete credential library")) + return false, errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete credential library")) } return rows > 0, nil } @@ -391,13 +391,13 @@ func (s Service) authResult(ctx context.Context, id string, a action.Type) auth. } parentId = cl.GetStoreId() default: - res.Error = errors.New(errors.InvalidParameter, op, "unrecognized credential library subtype from id") + res.Error = errors.New(ctx, errors.InvalidParameter, op, "unrecognized credential library subtype from id") return res } } if parentId == "" { - res.Error = errors.New(errors.RecordNotFound, op, "unable to find credential store for provided library") + res.Error = errors.New(ctx, errors.RecordNotFound, op, "unable to find credential store for provided library") return res } @@ -416,7 +416,7 @@ func (s Service) authResult(ctx context.Context, id string, a action.Type) auth. } opts = append(opts, auth.WithScopeId(cs.GetScopeId())) default: - res.Error = errors.New(errors.InvalidParameter, op, "unrecognized credential store subtype from id") + res.Error = errors.New(ctx, errors.InvalidParameter, op, "unrecognized credential store subtype from id") return res } @@ -468,7 +468,7 @@ func toProto(in credential.Library, opt ...handlers.Option) (*pb.CredentialLibra case vault.Subtype: vaultIn, ok := in.(*vault.CredentialLibrary) if !ok { - return nil, errors.New(errors.Internal, op, "unable to cast to vault credential library") + return nil, errors.NewDeprecated(errors.Internal, op, "unable to cast to vault credential library") } attrs := &pb.VaultCredentialLibraryAttributes{ Path: wrapperspb.String(vaultIn.GetVaultPath()), @@ -482,7 +482,7 @@ func toProto(in credential.Library, opt ...handlers.Option) (*pb.CredentialLibra var err error out.Attributes, err = handlers.ProtoToStruct(attrs) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("failed to convert resource from storage to api")) + return nil, errors.WrapDeprecated(err, op, errors.WithMsg("failed to convert resource from storage to api")) } } } @@ -501,7 +501,7 @@ func toStorageVaultLibrary(storeId string, in *pb.CredentialLibrary) (out *vault attrs := &pb.VaultCredentialLibraryAttributes{} if err := handlers.StructToProto(in.GetAttributes(), attrs); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to parse the attributes")) + return nil, errors.WrapDeprecated(err, op, errors.WithMsg("unable to parse the attributes")) } if attrs.GetHttpMethod() != nil { @@ -513,7 +513,7 @@ func toStorageVaultLibrary(storeId string, in *pb.CredentialLibrary) (out *vault cs, err := vault.NewCredentialLibrary(storeId, attrs.GetPath().GetValue(), opts...) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to build credential library")) + return nil, errors.WrapDeprecated(err, op, errors.WithMsg("unable to build credential library")) } return cs, err } diff --git a/internal/servers/controller/handlers/credentialstores/credentialstore_service.go b/internal/servers/controller/handlers/credentialstores/credentialstore_service.go index 167ce764e..d91f91e8b 100644 --- a/internal/servers/controller/handlers/credentialstores/credentialstore_service.go +++ b/internal/servers/controller/handlers/credentialstores/credentialstore_service.go @@ -80,10 +80,10 @@ type Service struct { func NewService(repo common.VaultCredentialRepoFactory, iamRepo common.IamRepoFactory) (Service, error) { const op = "credentialstores.NewService" if iamRepo == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing iam repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing iam repository") } if repo == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing vault credential repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing vault credential repository") } return Service{iamRepoFn: iamRepo, repoFn: repo}, nil } @@ -189,7 +189,7 @@ func (s Service) GetCredentialStore(ctx context.Context, req *pbs.GetCredentialS outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -234,7 +234,7 @@ func (s Service) CreateCredentialStore(ctx context.Context, req *pbs.CreateCrede outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -282,7 +282,7 @@ func (s Service) UpdateCredentialStore(ctx context.Context, req *pbs.UpdateCrede outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -329,11 +329,11 @@ func (s Service) listFromRepo(ctx context.Context, scopeIds []string) ([]*vault. const op = "credentialstores.(Service).listFromRepo" repo, err := s.repoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } csl, err := repo.ListCredentialStores(ctx, scopeIds) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return csl, nil } @@ -342,14 +342,14 @@ func (s Service) getFromRepo(ctx context.Context, id string) (credential.Store, const op = "credentialstores.(Service).getFromRepo" repo, err := s.repoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } cs, err := repo.LookupCredentialStore(ctx, id) if err != nil && !errors.IsNotFoundError(err) { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if cs == nil { - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("credential store %q not found", id)) + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("credential store %q not found", id)) } return cs, err } @@ -358,15 +358,15 @@ func (s Service) createInRepo(ctx context.Context, projId string, item *pb.Crede const op = "credentialstores.(Service).createInRepo" cs, err := toStorageVaultStore(projId, item) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } repo, err := s.repoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } out, err := repo.CreateCredentialStore(ctx, cs) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create credential store")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create credential store")) } if out == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to create credential store but no error returned from repository.") @@ -378,7 +378,7 @@ func (s Service) updateInRepo(ctx context.Context, projId, id string, mask []str const op = "credentialstores.(Service).updateInRepo" cs, err := toStorageVaultStore(projId, item) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } cs.PublicId = id @@ -388,11 +388,11 @@ func (s Service) updateInRepo(ctx context.Context, projId, id string, mask []str } repo, err := s.repoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } out, rowsUpdated, err := repo.UpdateCredentialStore(ctx, cs, item.GetVersion(), dbMask) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to update credential store")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to update credential store")) } if rowsUpdated == 0 { return nil, handlers.NotFoundErrorf("Credential Store %q doesn't exist or incorrect version provided.", id) @@ -411,7 +411,7 @@ func (s Service) deleteFromRepo(ctx context.Context, id string) (bool, error) { if errors.IsNotFoundError(err) { return false, nil } - return false, errors.Wrap(err, op, errors.WithMsg("unable to delete credential store")) + return false, errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete credential store")) } return rows > 0, nil } @@ -505,7 +505,7 @@ func toProto(in credential.Store, opt ...handlers.Option) (*pb.CredentialStore, case vault.Subtype: vaultIn, ok := in.(*vault.CredentialStore) if !ok { - return nil, errors.New(errors.Internal, op, "unable to cast to vault credential store") + return nil, errors.NewDeprecated(errors.Internal, op, "unable to cast to vault credential store") } attrs := &pb.VaultCredentialStoreAttributes{ Address: wrapperspb.String(vaultIn.GetVaultAddress()), @@ -534,7 +534,7 @@ func toProto(in credential.Store, opt ...handlers.Option) (*pb.CredentialStore, var err error if out.Attributes, err = handlers.ProtoToStruct(attrs); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.WrapDeprecated(err, op) } } } @@ -553,7 +553,7 @@ func toStorageVaultStore(scopeId string, in *pb.CredentialStore) (out *vault.Cre attrs := &pb.VaultCredentialStoreAttributes{} if err := handlers.StructToProto(in.GetAttributes(), attrs); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to parse the attributes")) + return nil, errors.WrapDeprecated(err, op, errors.WithMsg("unable to parse the attributes")) } if attrs.GetTlsServerName() != nil { opts = append(opts, vault.WithTlsServerName(attrs.GetTlsServerName().GetValue())) @@ -572,7 +572,7 @@ func toStorageVaultStore(scopeId string, in *pb.CredentialStore) (out *vault.Cre } pemCerts, pemPk, err := extractClientCertAndPk(attrs.GetClientCertificate().GetValue(), attrs.GetClientCertificateKey().GetValue()) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.WrapDeprecated(err, op) } if len(pemCerts) != 0 { var cert []byte @@ -585,14 +585,14 @@ func toStorageVaultStore(scopeId string, in *pb.CredentialStore) (out *vault.Cre } cc, err := vault.NewClientCertificate(cert, pk) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.WrapDeprecated(err, op) } opts = append(opts, vault.WithClientCert(cc)) } cs, err := vault.NewCredentialStore(scopeId, attrs.GetAddress().GetValue(), []byte(attrs.GetToken().GetValue()), opts...) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to build credential store for creation")) + return nil, errors.WrapDeprecated(err, op, errors.WithMsg("unable to build credential store for creation")) } return cs, err } diff --git a/internal/servers/controller/handlers/credentialstores/vault.go b/internal/servers/controller/handlers/credentialstores/vault.go index 790a482b0..d4aa7c13a 100644 --- a/internal/servers/controller/handlers/credentialstores/vault.go +++ b/internal/servers/controller/handlers/credentialstores/vault.go @@ -16,7 +16,7 @@ func extractClientCertAndPk(cert, pk string) ([]*pem.Block, *pem.Block, error) { const op = "credentialstores.extractClientCertAndPk" pks, err := decodePemBlocks(pk) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("failed to parse client certificate private key")) + return nil, nil, errors.WrapDeprecated(err, op, errors.WithMsg("failed to parse client certificate private key")) } var pkPem *pem.Block switch len(pks) { @@ -24,12 +24,12 @@ func extractClientCertAndPk(cert, pk string) ([]*pem.Block, *pem.Block, error) { case 1: pkPem = pks[0] default: - return nil, nil, errors.New(errors.InvalidParameter, op, "private key payload contained multiple pem blocks") + return nil, nil, errors.NewDeprecated(errors.InvalidParameter, op, "private key payload contained multiple pem blocks") } bs, err := decodePemBlocks(cert) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("failed to parse client certificate into pem blocks")) + return nil, nil, errors.WrapDeprecated(err, op, errors.WithMsg("failed to parse client certificate into pem blocks")) } pkIdx := -1 for i, b := range bs { @@ -38,9 +38,9 @@ func extractClientCertAndPk(cert, pk string) ([]*pem.Block, *pem.Block, error) { case pkPem == nil: pkIdx, pkPem = i, b case pkIdx < 0: - return nil, nil, errors.New(errors.InvalidParameter, op, "client certificate contains a private key when one was also provided separately") + return nil, nil, errors.NewDeprecated(errors.InvalidParameter, op, "client certificate contains a private key when one was also provided separately") default: - return nil, nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("second primary key found at %d after previous one found at %d", i, pkIdx)) + return nil, nil, errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("second primary key found at %d after previous one found at %d", i, pkIdx)) } } } @@ -64,7 +64,7 @@ func decodePemBlocks(input string) ([]*pem.Block, error) { ret = append(ret, p) } if len(cpIn) > 0 { - return nil, errors.New(errors.InvalidParameter, op, "not all data parseable by pem block") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "not all data parseable by pem block") } return ret, nil } diff --git a/internal/servers/controller/handlers/errors_test.go b/internal/servers/controller/handlers/errors_test.go index 903e2fc18..73743b5c9 100644 --- a/internal/servers/controller/handlers/errors_test.go +++ b/internal/servers/controller/handlers/errors_test.go @@ -107,7 +107,7 @@ func TestApiErrorHandler(t *testing.T) { }, { name: "Domain error Db invalid public id", - err: errors.E(errors.WithCode(errors.InvalidPublicId)), + err: errors.E(ctx, errors.WithCode(errors.InvalidPublicId)), expected: apiError{ status: http.StatusInternalServerError, inner: &pb.Error{ @@ -118,7 +118,7 @@ func TestApiErrorHandler(t *testing.T) { }, { name: "Domain error Db invalid parameter", - err: errors.E(errors.WithCode(errors.InvalidParameter)), + err: errors.E(ctx, errors.WithCode(errors.InvalidParameter)), expected: apiError{ status: http.StatusInternalServerError, inner: &pb.Error{ @@ -129,7 +129,7 @@ func TestApiErrorHandler(t *testing.T) { }, { name: "Domain error Db invalid field mask", - err: errors.E(errors.WithCode(errors.InvalidFieldMask)), + err: errors.E(ctx, errors.WithCode(errors.InvalidFieldMask)), expected: apiError{ status: http.StatusBadRequest, inner: &pb.Error{ @@ -141,7 +141,7 @@ func TestApiErrorHandler(t *testing.T) { }, { name: "Domain error Db empty field mask", - err: errors.E(errors.WithCode(errors.EmptyFieldMask)), + err: errors.E(ctx, errors.WithCode(errors.EmptyFieldMask)), expected: apiError{ status: http.StatusBadRequest, inner: &pb.Error{ @@ -153,7 +153,7 @@ func TestApiErrorHandler(t *testing.T) { }, { name: "Domain error Db not unqiue", - err: errors.E(errors.WithCode(errors.NotUnique)), + err: errors.E(ctx, errors.WithCode(errors.NotUnique)), expected: apiError{ status: http.StatusBadRequest, inner: &pb.Error{ @@ -164,7 +164,7 @@ func TestApiErrorHandler(t *testing.T) { }, { name: "Domain error Db record not found", - err: errors.E(errors.WithCode(errors.RecordNotFound)), + err: errors.E(ctx, errors.WithCode(errors.RecordNotFound)), expected: apiError{ status: http.StatusNotFound, inner: &pb.Error{ @@ -175,7 +175,7 @@ func TestApiErrorHandler(t *testing.T) { }, { name: "Domain error Db multiple records", - err: errors.E(errors.WithCode(errors.MultipleRecords)), + err: errors.E(ctx, errors.WithCode(errors.MultipleRecords)), expected: apiError{ status: http.StatusInternalServerError, inner: &pb.Error{ @@ -186,7 +186,7 @@ func TestApiErrorHandler(t *testing.T) { }, { name: "Domain error account already associated", - err: errors.E(errors.WithCode(errors.AccountAlreadyAssociated)), + err: errors.E(ctx, errors.WithCode(errors.AccountAlreadyAssociated)), expected: apiError{ status: http.StatusBadRequest, inner: &pb.Error{ @@ -197,7 +197,7 @@ func TestApiErrorHandler(t *testing.T) { }, { name: "Wrapped domain error", - err: errors.E(errors.WithCode(errors.InvalidAddress), errors.WithMsg("test msg"), errors.WithWrap(errors.E(errors.WithCode(errors.NotNull), errors.WithMsg("inner msg")))), + err: errors.E(ctx, errors.WithCode(errors.InvalidAddress), errors.WithMsg("test msg"), errors.WithWrap(errors.E(ctx, errors.WithCode(errors.NotNull), errors.WithMsg("inner msg")))), expected: apiError{ status: http.StatusInternalServerError, inner: &pb.Error{ @@ -208,7 +208,7 @@ func TestApiErrorHandler(t *testing.T) { }, { name: "Forbidden domain error", - err: errors.E(errors.WithCode(errors.Forbidden), errors.WithMsg("test msg")), + err: errors.E(ctx, errors.WithCode(errors.Forbidden), errors.WithMsg("test msg")), expected: apiError{ status: http.StatusForbidden, inner: &pb.Error{ @@ -219,7 +219,7 @@ func TestApiErrorHandler(t *testing.T) { }, { name: "Wrapped forbidden domain error", - err: fmt.Errorf("got error: %w", errors.E(errors.WithCode(errors.Forbidden), errors.WithMsg("test msg"))), + err: fmt.Errorf("got error: %w", errors.E(ctx, errors.WithCode(errors.Forbidden), errors.WithMsg("test msg"))), expected: apiError{ status: http.StatusForbidden, inner: &pb.Error{ diff --git a/internal/servers/controller/handlers/filtering.go b/internal/servers/controller/handlers/filtering.go index dbca74446..f09853681 100644 --- a/internal/servers/controller/handlers/filtering.go +++ b/internal/servers/controller/handlers/filtering.go @@ -25,7 +25,7 @@ func NewFilter(f string) (*Filter, error) { } e, err := bexpr.CreateEvaluator(f, bexpr.WithTagName("json"), bexpr.WithHookFn(filter.WellKnownTypeFilterHook)) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("couldn't build filter"), errors.WithCode(errors.InvalidParameter)) + return nil, errors.WrapDeprecated(err, op, errors.WithMsg("couldn't build filter"), errors.WithCode(errors.InvalidParameter)) } return &Filter{eval: e}, nil } diff --git a/internal/servers/controller/handlers/groups/group_service.go b/internal/servers/controller/handlers/groups/group_service.go index b6ebf8b49..a03223550 100644 --- a/internal/servers/controller/handlers/groups/group_service.go +++ b/internal/servers/controller/handlers/groups/group_service.go @@ -65,7 +65,7 @@ type Service struct { func NewService(repo common.IamRepoFactory) (Service, error) { const op = "groups.NewService" if repo == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing iam repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing iam repository") } return Service{repoFn: repo}, nil } @@ -164,7 +164,7 @@ func (s Service) GetGroup(ctx context.Context, req *pbs.GetGroupRequest) (*pbs.G outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -202,7 +202,7 @@ func (s Service) CreateGroup(ctx context.Context, req *pbs.CreateGroupRequest) ( outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -240,7 +240,7 @@ func (s Service) UpdateGroup(ctx context.Context, req *pbs.UpdateGroupRequest) ( outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -294,7 +294,7 @@ func (s Service) AddGroupMembers(ctx context.Context, req *pbs.AddGroupMembersRe outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -332,7 +332,7 @@ func (s Service) SetGroupMembers(ctx context.Context, req *pbs.SetGroupMembersRe outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -370,7 +370,7 @@ func (s Service) RemoveGroupMembers(ctx context.Context, req *pbs.RemoveGroupMem outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -394,14 +394,14 @@ func (s Service) getFromRepo(ctx context.Context, id string) (*iam.Group, []*iam const op = "groups.(Service).getFromRepo" repo, err := s.repoFn() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } g, m, err := repo.LookupGroup(ctx, id) if err != nil && !errors.IsNotFoundError(err) { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } if g == nil { - return nil, nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("group %q not found", id)) + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("group %q not found", id)) } return g, m, err } @@ -421,11 +421,11 @@ func (s Service) createInRepo(ctx context.Context, scopeId string, item *pb.Grou } repo, err := s.repoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } out, err := repo.CreateGroup(ctx, u) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if out == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to create group but no error returned from repository.") @@ -454,11 +454,11 @@ func (s Service) updateInRepo(ctx context.Context, scopeId, id string, mask []st } repo, err := s.repoFn() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } out, m, rowsUpdated, err := repo.UpdateGroup(ctx, g, version, dbMask) if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } if rowsUpdated == 0 { return nil, nil, handlers.NotFoundErrorf("Group %q doesn't exist or incorrect version provided.", id) @@ -477,7 +477,7 @@ func (s Service) deleteFromRepo(ctx context.Context, id string) (bool, error) { if errors.IsNotFoundError(err) { return false, nil } - return false, errors.Wrap(err, op, errors.WithMsg("unable to delete group")) + return false, errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete group")) } return rows > 0, nil } @@ -486,11 +486,11 @@ func (s Service) listFromRepo(ctx context.Context, scopeIds []string) ([]*iam.Gr const op = "groups.(Service).listFromRepo" repo, err := s.repoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } gl, err := repo.ListGroups(ctx, scopeIds) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return gl, nil } @@ -499,7 +499,7 @@ func (s Service) addMembersInRepo(ctx context.Context, groupId string, userIds [ const op = "groups.(Service).addMembersInRepo" repo, err := s.repoFn() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } _, err = repo.AddGroupMembers(ctx, groupId, version, strutil.RemoveDuplicates(userIds, false)) if err != nil { @@ -508,7 +508,7 @@ func (s Service) addMembersInRepo(ctx context.Context, groupId string, userIds [ } out, m, err := repo.LookupGroup(ctx, groupId) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to look up group after adding memebers")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to look up group after adding memebers")) } if out == nil { return nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to lookup group after adding member to it.") @@ -520,7 +520,7 @@ func (s Service) setMembersInRepo(ctx context.Context, groupId string, userIds [ const op = "groups.(Service).setMembersInRepo" repo, err := s.repoFn() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } _, _, err = repo.SetGroupMembers(ctx, groupId, version, strutil.RemoveDuplicates(userIds, false)) if err != nil { @@ -529,7 +529,7 @@ func (s Service) setMembersInRepo(ctx context.Context, groupId string, userIds [ } out, m, err := repo.LookupGroup(ctx, groupId) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to look up group after setting members")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to look up group after setting members")) } if out == nil { return nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to lookup group after setting members for it.") @@ -541,7 +541,7 @@ func (s Service) removeMembersInRepo(ctx context.Context, groupId string, userId const op = "groups.(Service).removeMembersInRepo" repo, err := s.repoFn() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } _, err = repo.DeleteGroupMembers(ctx, groupId, version, strutil.RemoveDuplicates(userIds, false)) if err != nil { @@ -550,7 +550,7 @@ func (s Service) removeMembersInRepo(ctx context.Context, groupId string, userId } out, m, err := repo.LookupGroup(ctx, groupId) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to look up group after removing members")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to look up group after removing members")) } if out == nil { return nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to lookup group after removing members from it.") diff --git a/internal/servers/controller/handlers/host_catalogs/host_catalog_service.go b/internal/servers/controller/handlers/host_catalogs/host_catalog_service.go index 671242c0d..5223e6b33 100644 --- a/internal/servers/controller/handlers/host_catalogs/host_catalog_service.go +++ b/internal/servers/controller/handlers/host_catalogs/host_catalog_service.go @@ -72,10 +72,10 @@ var _ pbs.HostCatalogServiceServer = Service{} func NewService(repoFn common.StaticRepoFactory, iamRepoFn common.IamRepoFactory) (Service, error) { const op = "host_catalogs.NewService" if repoFn == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing static repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing static repository") } if iamRepoFn == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing iam repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing iam repository") } return Service{staticRepoFn: repoFn, iamRepoFn: iamRepoFn}, nil } @@ -178,7 +178,7 @@ func (s Service) GetHostCatalog(ctx context.Context, req *pbs.GetHostCatalogRequ outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -223,7 +223,7 @@ func (s Service) CreateHostCatalog(ctx context.Context, req *pbs.CreateHostCatal outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -271,7 +271,7 @@ func (s Service) UpdateHostCatalog(ctx context.Context, req *pbs.UpdateHostCatal outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -352,15 +352,15 @@ func (s Service) createInRepo(ctx context.Context, projId string, item *pb.HostC } h, err := static.NewHostCatalog(projId, opts...) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to build host catalog for creation")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to build host catalog for creation")) } repo, err := s.staticRepoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } out, err := repo.CreateCatalog(ctx, h) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create host catalog")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create host catalog")) } if out == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to create host catalog but no error returned from repository.") @@ -380,7 +380,7 @@ func (s Service) updateInRepo(ctx context.Context, projId, id string, mask []str version := item.GetVersion() h, err := static.NewHostCatalog(projId, opts...) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to build host catalog for update")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to build host catalog for update")) } h.PublicId = id dbMask := maskManager.Translate(mask) @@ -389,11 +389,11 @@ func (s Service) updateInRepo(ctx context.Context, projId, id string, mask []str } repo, err := s.staticRepoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } out, rowsUpdated, err := repo.UpdateCatalog(ctx, h, version, dbMask) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to update host catalog")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to update host catalog")) } if rowsUpdated == 0 { return nil, handlers.NotFoundErrorf("Host Catalog %q doesn't exist or incorrect version provided.", id) @@ -405,11 +405,11 @@ func (s Service) deleteFromRepo(ctx context.Context, id string) (bool, error) { const op = "host_catalogs.(Service).deleteFromRepo" repo, err := s.staticRepoFn() if err != nil { - return false, errors.Wrap(err, op) + return false, errors.Wrap(ctx, err, op) } rows, err := repo.DeleteCatalog(ctx, id) if err != nil { - return false, errors.Wrap(err, op, errors.WithMsg("unable to delete host")) + return false, errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete host")) } return rows > 0, nil } diff --git a/internal/servers/controller/handlers/host_sets/host_set_service.go b/internal/servers/controller/handlers/host_sets/host_set_service.go index 5d45d79ca..288dd027c 100644 --- a/internal/servers/controller/handlers/host_sets/host_set_service.go +++ b/internal/servers/controller/handlers/host_sets/host_set_service.go @@ -66,7 +66,7 @@ var _ pbs.HostSetServiceServer = Service{} func NewService(repoFn common.StaticRepoFactory) (Service, error) { const op = "host_sets.NewService" if repoFn == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing static repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing static repository") } return Service{staticRepoFn: repoFn}, nil } @@ -145,7 +145,7 @@ func (s Service) GetHostSet(ctx context.Context, req *pbs.GetHostSetRequest) (*p outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -183,7 +183,7 @@ func (s Service) CreateHostSet(ctx context.Context, req *pbs.CreateHostSetReques outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -224,7 +224,7 @@ func (s Service) UpdateHostSet(ctx context.Context, req *pbs.UpdateHostSetReques outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -278,7 +278,7 @@ func (s Service) AddHostSetHosts(ctx context.Context, req *pbs.AddHostSetHostsRe outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -315,7 +315,7 @@ func (s Service) SetHostSetHosts(ctx context.Context, req *pbs.SetHostSetHostsRe } outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -353,7 +353,7 @@ func (s Service) RemoveHostSetHosts(ctx context.Context, req *pbs.RemoveHostSetH outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -399,7 +399,7 @@ func (s Service) createInRepo(ctx context.Context, scopeId, catalogId string, it } h, err := static.NewHostSet(catalogId, opts...) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("Unable to build host set for creation")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("Unable to build host set for creation")) } repo, err := s.staticRepoFn() if err != nil { @@ -407,7 +407,7 @@ func (s Service) createInRepo(ctx context.Context, scopeId, catalogId string, it } out, err := repo.CreateSet(ctx, scopeId, h) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create host set")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create host set")) } if out == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to create host set but no error returned from repository.") @@ -426,7 +426,7 @@ func (s Service) updateInRepo(ctx context.Context, scopeId, catalogId, id string } h, err := static.NewHostSet(catalogId, opts...) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("Unable to build host set for update")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("Unable to build host set for update")) } h.PublicId = id dbMask := maskManager.Translate(mask) @@ -439,7 +439,7 @@ func (s Service) updateInRepo(ctx context.Context, scopeId, catalogId, id string } out, m, rowsUpdated, err := repo.UpdateSet(ctx, scopeId, h, item.GetVersion(), dbMask) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to update host set")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to update host set")) } if rowsUpdated == 0 { return nil, nil, handlers.NotFoundErrorf("Host Set %q doesn't exist or incorrect version provided.", id) @@ -455,7 +455,7 @@ func (s Service) deleteFromRepo(ctx context.Context, scopeId, id string) (bool, } rows, err := repo.DeleteSet(ctx, scopeId, id) if err != nil { - return false, errors.Wrap(err, op, errors.WithMsg("unable to delete host")) + return false, errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete host")) } return rows > 0, nil } @@ -480,11 +480,11 @@ func (s Service) addInRepo(ctx context.Context, scopeId, setId string, hostIds [ } _, err = repo.AddSetMembers(ctx, scopeId, setId, version, strutil.RemoveDuplicates(hostIds, false)) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("Unable to add hosts to host set")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("Unable to add hosts to host set")) } out, m, err := repo.LookupSet(ctx, setId) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to look up host set after adding hosts")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to look up host set after adding hosts")) } if out == nil { return nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to lookup host set after adding hosts to it.") @@ -496,16 +496,16 @@ func (s Service) setInRepo(ctx context.Context, scopeId, setId string, hostIds [ const op = "host_sets.(Service).setInRepo" repo, err := s.staticRepoFn() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } _, _, err = repo.SetSetMembers(ctx, scopeId, setId, version, strutil.RemoveDuplicates(hostIds, false)) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("Unable to set hosts in host set")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("Unable to set hosts in host set")) } out, m, err := repo.LookupSet(ctx, setId) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to look up host set after setting hosts")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to look up host set after setting hosts")) } if out == nil { return nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to lookup host set after setting hosts for it.") @@ -517,15 +517,15 @@ func (s Service) removeInRepo(ctx context.Context, scopeId, setId string, hostId const op = "host_sets.(Service).removeInRepo" repo, err := s.staticRepoFn() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } _, err = repo.DeleteSetMembers(ctx, scopeId, setId, version, strutil.RemoveDuplicates(hostIds, false)) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("Unable to remove hosts from host set")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("Unable to remove hosts from host set")) } out, m, err := repo.LookupSet(ctx, setId) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to look up host set")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to look up host set")) } if out == nil { return nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to lookup host set after removing hosts from it.") diff --git a/internal/servers/controller/handlers/hosts/host_service.go b/internal/servers/controller/handlers/hosts/host_service.go index f8acd2e52..b2fd6bb2e 100644 --- a/internal/servers/controller/handlers/hosts/host_service.go +++ b/internal/servers/controller/handlers/hosts/host_service.go @@ -65,7 +65,7 @@ var _ pbs.HostServiceServer = Service{} func NewService(repoFn common.StaticRepoFactory) (Service, error) { const op = "hosts.NewService" if repoFn == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing static repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing static repository") } return Service{staticRepoFn: repoFn}, nil } @@ -144,7 +144,7 @@ func (s Service) GetHost(ctx context.Context, req *pbs.GetHostRequest) (*pbs.Get outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -182,7 +182,7 @@ func (s Service) CreateHost(ctx context.Context, req *pbs.CreateHostRequest) (*p outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -223,7 +223,7 @@ func (s Service) UpdateHost(ctx context.Context, req *pbs.UpdateHostRequest) (*p outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -292,16 +292,16 @@ func (s Service) createInRepo(ctx context.Context, scopeId, catalogId string, it } h, err := static.NewHost(catalogId, opts...) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("Unable to build host for creation")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("Unable to build host for creation")) } repo, err := s.staticRepoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } out, err := repo.CreateHost(ctx, scopeId, h) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("Unable to create host")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("Unable to create host")) } if out == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to create host but no error returned from repository.") @@ -327,7 +327,7 @@ func (s Service) updateInRepo(ctx context.Context, scopeId, catalogId, id string } h, err := static.NewHost(catalogId, opts...) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("Unable to build host for update")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("Unable to build host for update")) } h.PublicId = id dbMask := maskManager.Translate(mask) @@ -340,7 +340,7 @@ func (s Service) updateInRepo(ctx context.Context, scopeId, catalogId, id string } out, rowsUpdated, err := repo.UpdateHost(ctx, scopeId, h, item.GetVersion(), dbMask) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to update host")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to update host")) } if rowsUpdated == 0 { return nil, handlers.NotFoundErrorf("Host %q doesn't exist or incorrect version provided.", id) @@ -356,7 +356,7 @@ func (s Service) deleteFromRepo(ctx context.Context, scopeId, id string) (bool, } rows, err := repo.DeleteHost(ctx, scopeId, id) if err != nil { - return false, errors.Wrap(err, op, errors.WithMsg("unable to delete host")) + return false, errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete host")) } return rows > 0, nil } diff --git a/internal/servers/controller/handlers/managed_groups/managed_group_service.go b/internal/servers/controller/handlers/managed_groups/managed_group_service.go index aa321b20c..8b0745af6 100644 --- a/internal/servers/controller/handlers/managed_groups/managed_group_service.go +++ b/internal/servers/controller/handlers/managed_groups/managed_group_service.go @@ -70,7 +70,7 @@ type Service struct { func NewService(oidcRepo common.OidcAuthRepoFactory) (Service, error) { const op = "managed_groups.NewService" if oidcRepo == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing oidc repository provided") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing oidc repository provided") } return Service{oidcRepoFn: oidcRepo}, nil } @@ -155,7 +155,7 @@ func (s Service) GetManagedGroup(ctx context.Context, req *pbs.GetManagedGroupRe outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -197,7 +197,7 @@ func (s Service) CreateManagedGroup(ctx context.Context, req *pbs.CreateManagedG outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -236,7 +236,7 @@ func (s Service) UpdateManagedGroup(ctx context.Context, req *pbs.UpdateManagedG outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -308,7 +308,7 @@ func (s Service) getFromRepo(ctx context.Context, id string) (auth.ManagedGroup, func (s Service) createOidcInRepo(ctx context.Context, am auth.AuthMethod, item *pb.ManagedGroup) (*oidc.ManagedGroup, error) { const op = "managed_groups.(Service).createOidcInRepo" if item == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing item") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing item") } var opts []oidc.Option if item.GetName() != nil { @@ -322,7 +322,7 @@ func (s Service) createOidcInRepo(ctx context.Context, am auth.AuthMethod, item return nil, handlers.InvalidArgumentErrorf("Error in provided request.", map[string]string{"attributes": "Attribute fields do not match the expected format."}) } - mg, err := oidc.NewManagedGroup(am.GetPublicId(), attrs.GetFilter(), opts...) + mg, err := oidc.NewManagedGroup(ctx, am.GetPublicId(), attrs.GetFilter(), opts...) if err != nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to build user for creation: %v.", err) } @@ -333,7 +333,7 @@ func (s Service) createOidcInRepo(ctx context.Context, am auth.AuthMethod, item out, err := repo.CreateManagedGroup(ctx, am.GetScopeId(), mg) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create managed group")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create managed group")) } if out == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to create managed group but no error returned from repository.") @@ -344,14 +344,14 @@ func (s Service) createOidcInRepo(ctx context.Context, am auth.AuthMethod, item func (s Service) createInRepo(ctx context.Context, am auth.AuthMethod, item *pb.ManagedGroup) (auth.ManagedGroup, error) { const op = "managed_groups.(Service).createInRepo" if item == nil { - return nil, errors.New(errors.InvalidParameter, op, "missing item") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing item") } var out auth.ManagedGroup switch auth.SubtypeFromId(am.GetPublicId()) { case oidc.Subtype: am, err := s.createOidcInRepo(ctx, am, item) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if am == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to create managed group but no error returned from repository.") @@ -364,7 +364,7 @@ func (s Service) createInRepo(ctx context.Context, am auth.AuthMethod, item *pb. func (s Service) updateOidcInRepo(ctx context.Context, scopeId, amId, id string, mask []string, item *pb.ManagedGroup) (*oidc.ManagedGroup, error) { const op = "managed_groups.(Service).updateOidcInRepo" if item == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil managed group.") + return nil, errors.New(ctx, errors.InvalidParameter, op, "nil managed group.") } mg := oidc.AllocManagedGroup() mg.PublicId = id @@ -392,11 +392,11 @@ func (s Service) updateOidcInRepo(ctx context.Context, scopeId, amId, id string, } repo, err := s.oidcRepoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } out, rowsUpdated, err := repo.UpdateManagedGroup(ctx, scopeId, mg, version, dbMask) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to update managed group")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to update managed group")) } if rowsUpdated == 0 { return nil, handlers.NotFoundErrorf("Managed Group %q doesn't exist or incorrect version provided.", id) @@ -411,7 +411,7 @@ func (s Service) updateInRepo(ctx context.Context, scopeId, authMethodId string, case oidc.Subtype: mg, err := s.updateOidcInRepo(ctx, scopeId, authMethodId, req.GetId(), req.GetUpdateMask().GetPaths(), req.GetItem()) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if mg == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to update managed group but no error returned from repository.") @@ -437,7 +437,7 @@ func (s Service) deleteFromRepo(ctx context.Context, scopeId, id string) (bool, if errors.IsNotFoundError(err) { return false, nil } - return false, errors.Wrap(err, op) + return false, errors.Wrap(ctx, err, op) } return rows > 0, nil } @@ -450,11 +450,11 @@ func (s Service) listFromRepo(ctx context.Context, authMethodId string) ([]auth. case oidc.Subtype: oidcRepo, err := s.oidcRepoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } oidcl, err := oidcRepo.ListManagedGroups(ctx, authMethodId) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } for _, a := range oidcl { outUl = append(outUl, a) @@ -491,7 +491,7 @@ func (s Service) parentAndAuthResult(ctx context.Context, id string, a action.Ty } parentId = acct.GetAuthMethodId() default: - res.Error = errors.New(errors.InvalidPublicId, op, "unrecognized managed group subtype") + res.Error = errors.New(ctx, errors.InvalidPublicId, op, "unrecognized managed group subtype") return nil, res } opts = append(opts, requestauth.WithId(id)) @@ -512,7 +512,7 @@ func (s Service) parentAndAuthResult(ctx context.Context, id string, a action.Ty authMeth = am opts = append(opts, requestauth.WithScopeId(am.GetScopeId())) default: - res.Error = errors.New(errors.InvalidPublicId, op, "unrecognized auth method subtype") + res.Error = errors.New(ctx, errors.InvalidPublicId, op, "unrecognized auth method subtype") return nil, res } opts = append(opts, requestauth.WithPin(parentId)) @@ -585,7 +585,7 @@ func toProto(ctx context.Context, in auth.ManagedGroup, opt ...handlers.Option) func validateGetRequest(req *pbs.GetManagedGroupRequest) error { const op = "managed_groups.validateGetRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "nil request") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil request") } return handlers.ValidateGetRequest(handlers.NoopValidatorFn, req, intglobals.OidcManagedGroupPrefix) } @@ -593,7 +593,7 @@ func validateGetRequest(req *pbs.GetManagedGroupRequest) error { func validateCreateRequest(req *pbs.CreateManagedGroupRequest) error { const op = "managed_groups.validateCreateRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "nil request") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil request") } return handlers.ValidateCreateRequest(req.GetItem(), func() map[string]string { badFields := map[string]string{} @@ -626,7 +626,7 @@ func validateCreateRequest(req *pbs.CreateManagedGroupRequest) error { func validateUpdateRequest(req *pbs.UpdateManagedGroupRequest) error { const op = "managed_groups.validateUpdateRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "nil request") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil request") } return handlers.ValidateUpdateRequest(req, req.GetItem(), func() map[string]string { badFields := map[string]string{} @@ -658,7 +658,7 @@ func validateUpdateRequest(req *pbs.UpdateManagedGroupRequest) error { func validateDeleteRequest(req *pbs.DeleteManagedGroupRequest) error { const op = "managed_groups.validateDeleteRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "nil request") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil request") } return handlers.ValidateDeleteRequest(handlers.NoopValidatorFn, req, intglobals.OidcManagedGroupPrefix) } @@ -666,7 +666,7 @@ func validateDeleteRequest(req *pbs.DeleteManagedGroupRequest) error { func validateListRequest(req *pbs.ListManagedGroupsRequest) error { const op = "managed_groups.validateListRequest" if req == nil { - return errors.New(errors.InvalidParameter, op, "nil request") + return errors.NewDeprecated(errors.InvalidParameter, op, "nil request") } badFields := map[string]string{} if !handlers.ValidId(handlers.Id(req.GetAuthMethodId()), oidc.AuthMethodPrefix) { diff --git a/internal/servers/controller/handlers/managed_groups/managed_group_service_test.go b/internal/servers/controller/handlers/managed_groups/managed_group_service_test.go index 121b25fb3..a9fc8324b 100644 --- a/internal/servers/controller/handlers/managed_groups/managed_group_service_test.go +++ b/internal/servers/controller/handlers/managed_groups/managed_group_service_test.go @@ -45,12 +45,13 @@ var oidcAuthorizedActions = []string{ } func TestNewService(t *testing.T) { + ctx := context.TODO() conn, _ := db.TestSetup(t, "postgres") rw := db.New(conn) wrap := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrap) oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kmsCache) + return oidc.NewRepository(ctx, rw, rw, kmsCache) } cases := []struct { @@ -86,7 +87,7 @@ func TestGet(t *testing.T) { wrap := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrap) oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kmsCache) + return oidc.NewRepository(ctx, rw, rw, kmsCache) } iamRepoFn := func() (*iam.Repository, error) { return iam.NewRepository(rw, rw, kmsCache) @@ -187,7 +188,7 @@ func TestListOidc(t *testing.T) { wrap := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrap) oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kmsCache) + return oidc.NewRepository(ctx, rw, rw, kmsCache) } iamRepoFn := func() (*iam.Repository, error) { return iam.NewRepository(rw, rw, kmsCache) @@ -335,7 +336,7 @@ func TestDelete(t *testing.T) { wrap := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrap) oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kmsCache) + return oidc.NewRepository(ctx, rw, rw, kmsCache) } iamRepoFn := func() (*iam.Repository, error) { return iam.NewRepository(rw, rw, kmsCache) @@ -399,6 +400,7 @@ func TestDelete(t *testing.T) { } func TestDelete_twice(t *testing.T) { + ctx := context.TODO() assert, require := assert.New(t), require.New(t) conn, _ := db.TestSetup(t, "postgres") wrap := db.TestWrapper(t) @@ -406,7 +408,7 @@ func TestDelete_twice(t *testing.T) { kmsCache := kms.TestKms(t, conn, wrap) oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kmsCache) + return oidc.NewRepository(ctx, rw, rw, kmsCache) } iamRepoFn := func() (*iam.Repository, error) { return iam.NewRepository(rw, rw, kmsCache) @@ -444,7 +446,7 @@ func TestCreateOidc(t *testing.T) { wrap := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrap) oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kmsCache) + return oidc.NewRepository(ctx, rw, rw, kmsCache) } iamRepoFn := func() (*iam.Repository, error) { return iam.NewRepository(rw, rw, kmsCache) @@ -629,7 +631,7 @@ func TestUpdateOidc(t *testing.T) { wrap := db.TestWrapper(t) kmsCache := kms.TestKms(t, conn, wrap) oidcRepoFn := func() (*oidc.Repository, error) { - return oidc.NewRepository(rw, rw, kmsCache) + return oidc.NewRepository(ctx, rw, rw, kmsCache) } iamRepoFn := func() (*iam.Repository, error) { return iam.NewRepository(rw, rw, kmsCache) diff --git a/internal/servers/controller/handlers/mask_manager.go b/internal/servers/controller/handlers/mask_manager.go index ccc73ba75..fc358b80b 100644 --- a/internal/servers/controller/handlers/mask_manager.go +++ b/internal/servers/controller/handlers/mask_manager.go @@ -37,7 +37,7 @@ func NewMaskManager(dest MaskDestination, src MaskSource) (MaskManager, error) { for k, v := range srcToDest { ov, ok := destToSrc[v] if !ok || ov != k { - return nil, errors.New(errors.Encode, op, fmt.Sprintf("mapping src field %q maps to %q, dest %q maps to %q", k, v, v, ov)) + return nil, errors.NewDeprecated(errors.Encode, op, fmt.Sprintf("mapping src field %q maps to %q, dest %q maps to %q", k, v, v, ov)) } result[k] = v } @@ -45,12 +45,12 @@ func NewMaskManager(dest MaskDestination, src MaskSource) (MaskManager, error) { // Now check to make sure there aren't any dangling dest mappings. for k, v := range destToSrc { if ov, ok := srcToDest[v]; !ok || ov != k { - return nil, errors.New(errors.Encode, op, fmt.Sprintf("mapping src field %q maps to %q, dest %q maps to %q", k, v, v, ov)) + return nil, errors.NewDeprecated(errors.Encode, op, fmt.Sprintf("mapping src field %q maps to %q, dest %q maps to %q", k, v, v, ov)) } } if len(result) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "mask mapping generated is zero") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "mask mapping generated is zero") } return result, nil @@ -67,7 +67,7 @@ func mapFromProto(ps []protoreflect.ProtoMessage) (map[string]string, error) { opts := f.Options().(*descriptorpb.FieldOptions) if nameMap := proto.GetExtension(opts, pb.E_MaskMapping).(*pb.MaskMapping); !proto.Equal(nameMap, &pb.MaskMapping{}) && nameMap != nil { if _, ok := mapping[nameMap.GetThis()]; ok { - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("duplicate mapping from field %q with the mapping key %q", f.Name(), nameMap.GetThis())) + return nil, errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("duplicate mapping from field %q with the mapping key %q", f.Name(), nameMap.GetThis())) } mapping[nameMap.GetThis()] = nameMap.GetThat() } diff --git a/internal/servers/controller/handlers/roles/role_service.go b/internal/servers/controller/handlers/roles/role_service.go index 815e6dc30..662c9655c 100644 --- a/internal/servers/controller/handlers/roles/role_service.go +++ b/internal/servers/controller/handlers/roles/role_service.go @@ -69,7 +69,7 @@ type Service struct { func NewService(repo common.IamRepoFactory) (Service, error) { const op = "roles.NewService" if repo == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing iam repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing iam repository") } return Service{repoFn: repo}, nil } @@ -168,7 +168,7 @@ func (s Service) GetRole(ctx context.Context, req *pbs.GetRoleRequest) (*pbs.Get outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -206,7 +206,7 @@ func (s Service) CreateRole(ctx context.Context, req *pbs.CreateRoleRequest) (*p outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -244,7 +244,7 @@ func (s Service) UpdateRole(ctx context.Context, req *pbs.UpdateRoleRequest) (*p outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -298,7 +298,7 @@ func (s Service) AddRolePrincipals(ctx context.Context, req *pbs.AddRolePrincipa outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -336,7 +336,7 @@ func (s Service) SetRolePrincipals(ctx context.Context, req *pbs.SetRolePrincipa outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -374,7 +374,7 @@ func (s Service) RemoveRolePrincipals(ctx context.Context, req *pbs.RemoveRolePr outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -412,7 +412,7 @@ func (s Service) AddRoleGrants(ctx context.Context, req *pbs.AddRoleGrantsReques outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -450,7 +450,7 @@ func (s Service) SetRoleGrants(ctx context.Context, req *pbs.SetRoleGrantsReques outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -488,7 +488,7 @@ func (s Service) RemoveRoleGrants(ctx context.Context, req *pbs.RemoveRoleGrants outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -548,7 +548,7 @@ func (s Service) createInRepo(ctx context.Context, scopeId string, item *pb.Role } out, err := repo.CreateRole(ctx, u) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if out == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to create role but no error returned from repository.") @@ -585,7 +585,7 @@ func (s Service) updateInRepo(ctx context.Context, scopeId, id string, mask []st } out, pr, gr, rowsUpdated, err := repo.UpdateRole(ctx, u, version, dbMask) if err != nil { - return nil, nil, nil, errors.Wrap(err, op) + return nil, nil, nil, errors.Wrap(ctx, err, op) } if rowsUpdated == 0 { return nil, nil, nil, handlers.NotFoundErrorf("Role %q doesn't exist or incorrect version provided.", id) @@ -604,7 +604,7 @@ func (s Service) deleteFromRepo(ctx context.Context, id string) (bool, error) { if errors.IsNotFoundError(err) { return false, nil } - return false, errors.Wrap(err, op, errors.WithMsg("unable to delete role")) + return false, errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete role")) } return rows > 0, nil } @@ -634,7 +634,7 @@ func (s Service) addPrinciplesInRepo(ctx context.Context, roleId string, princip } out, pr, roleGrants, err := repo.LookupRole(ctx, roleId) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to look up role after adding principals")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to look up role after adding principals")) } if out == nil { return nil, nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to lookup role after adding principals to it.") @@ -655,7 +655,7 @@ func (s Service) setPrinciplesInRepo(ctx context.Context, roleId string, princip } out, pr, roleGrants, err := repo.LookupRole(ctx, roleId) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to look up role after setting principals")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to look up role after setting principals")) } if out == nil { return nil, nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to lookup role after setting principals for it.") @@ -676,7 +676,7 @@ func (s Service) removePrinciplesInRepo(ctx context.Context, roleId string, prin } out, pr, roleGrants, err := repo.LookupRole(ctx, roleId) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to look up role after removing principals")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to look up role after removing principals")) } if out == nil { return nil, nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to lookup role after removing principals from it.") @@ -697,7 +697,7 @@ func (s Service) addGrantsInRepo(ctx context.Context, roleId string, grants []st } out, pr, roleGrants, err := repo.LookupRole(ctx, roleId) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to look up role after adding grants")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to look up role after adding grants")) } if out == nil { return nil, nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to lookup role after adding grants to it.") @@ -722,7 +722,7 @@ func (s Service) setGrantsInRepo(ctx context.Context, roleId string, grants []st } out, pr, roleGrants, err := repo.LookupRole(ctx, roleId) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to look up role after setting grants")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to look up role after setting grants")) } if out == nil { return nil, nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to lookup role after setting grants on it.") @@ -743,7 +743,7 @@ func (s Service) removeGrantsInRepo(ctx context.Context, roleId string, grants [ } out, pr, roleGrants, err := repo.LookupRole(ctx, roleId) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("uable to look up role after removing grant")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("uable to look up role after removing grant")) } if out == nil { return nil, nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to lookup role after removing grants from it.") diff --git a/internal/servers/controller/handlers/scopes/scope_service.go b/internal/servers/controller/handlers/scopes/scope_service.go index 4ad2070dc..d1fce7714 100644 --- a/internal/servers/controller/handlers/scopes/scope_service.go +++ b/internal/servers/controller/handlers/scopes/scope_service.go @@ -102,7 +102,7 @@ type Service struct { func NewService(repo common.IamRepoFactory) (Service, error) { const op = "scopes.(Service).NewService" if repo == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing iam repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing iam repository") } return Service{repoFn: repo}, nil } @@ -213,7 +213,7 @@ func (s Service) GetScope(ctx context.Context, req *pbs.GetScopeRequest) (*pbs.G outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -263,7 +263,7 @@ func (s Service) CreateScope(ctx context.Context, req *pbs.CreateScopeRequest) ( outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -308,7 +308,7 @@ func (s Service) UpdateScope(ctx context.Context, req *pbs.UpdateScopeRequest) ( outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -397,7 +397,7 @@ func (s Service) createInRepo(ctx context.Context, authResults auth.VerifyResult } out, err := repo.CreateScope(ctx, iamScope, authResults.UserId, opts...) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create scope")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create scope")) } if out == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to create scope but no error returned from repository.") @@ -457,7 +457,7 @@ func (s Service) updateInRepo(ctx context.Context, parentScope *pb.ScopeInfo, sc } out, rowsUpdated, err := repo.UpdateScope(ctx, iamScope, version, dbMask) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to update project")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to update project")) } if rowsUpdated == 0 { return nil, handlers.NotFoundErrorf("Scope %q doesn't exist or incorrect version provided.", scopeId) @@ -473,7 +473,7 @@ func (s Service) deleteFromRepo(ctx context.Context, scopeId string) (bool, erro } rows, err := repo.DeleteScope(ctx, scopeId) if err != nil { - return false, errors.Wrap(err, op, errors.WithMsg("unable to delete scope")) + return false, errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete scope")) } return rows > 0, nil } diff --git a/internal/servers/controller/handlers/sessions/session_service.go b/internal/servers/controller/handlers/sessions/session_service.go index afa53a286..399e185d3 100644 --- a/internal/servers/controller/handlers/sessions/session_service.go +++ b/internal/servers/controller/handlers/sessions/session_service.go @@ -53,10 +53,10 @@ type Service struct { func NewService(repoFn common.SessionRepoFactory, iamRepoFn common.IamRepoFactory) (Service, error) { const op = "sessions.NewService" if repoFn == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing session repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing session repository") } if iamRepoFn == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing iam repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing iam repository") } return Service{repoFn: repoFn, iamRepoFn: iamRepoFn}, nil } @@ -96,7 +96,7 @@ func (s Service) GetSession(ctx context.Context, req *pbs.GetSessionRequest) (*p var ok bool outputFields, ok = requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } } @@ -233,7 +233,7 @@ func (s Service) CancelSession(ctx context.Context, req *pbs.CancelSessionReques var ok bool outputFields, ok = requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } } @@ -306,7 +306,7 @@ func (s Service) cancelInRepo(ctx context.Context, id string, version uint32) (* } out, err := repo.CancelSession(ctx, id, version) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to update session")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to update session")) } return out, nil } diff --git a/internal/servers/controller/handlers/targets/target_service.go b/internal/servers/controller/handlers/targets/target_service.go index e7784d362..c4c877b57 100644 --- a/internal/servers/controller/handlers/targets/target_service.go +++ b/internal/servers/controller/handlers/targets/target_service.go @@ -106,22 +106,22 @@ func NewService( vaultCredRepoFn common.VaultCredentialRepoFactory) (Service, error) { const op = "targets.NewService" if repoFn == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing target repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing target repository") } if iamRepoFn == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing iam repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing iam repository") } if serversRepoFn == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing servers repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing servers repository") } if sessionRepoFn == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing session repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing session repository") } if staticHostRepoFn == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing static host repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing static host repository") } if vaultCredRepoFn == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing vault credential repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing vault credential repository") } return Service{ repoFn: repoFn, @@ -228,7 +228,7 @@ func (s Service) GetTarget(ctx context.Context, req *pbs.GetTargetRequest) (*pbs outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -266,7 +266,7 @@ func (s Service) CreateTarget(ctx context.Context, req *pbs.CreateTargetRequest) outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -304,7 +304,7 @@ func (s Service) UpdateTarget(ctx context.Context, req *pbs.UpdateTargetRequest) outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -358,7 +358,7 @@ func (s Service) AddTargetHostSets(ctx context.Context, req *pbs.AddTargetHostSe outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -396,7 +396,7 @@ func (s Service) SetTargetHostSets(ctx context.Context, req *pbs.SetTargetHostSe outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -434,7 +434,7 @@ func (s Service) RemoveTargetHostSets(ctx context.Context, req *pbs.RemoveTarget outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -472,7 +472,7 @@ func (s Service) AddTargetCredentialLibraries(ctx context.Context, req *pbs.AddT outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -510,7 +510,7 @@ func (s Service) SetTargetCredentialLibraries(ctx context.Context, req *pbs.SetT outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -548,7 +548,7 @@ func (s Service) RemoveTargetCredentialLibraries(ctx context.Context, req *pbs.R outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -586,7 +586,7 @@ func (s Service) AddTargetCredentialSources(ctx context.Context, req *pbs.AddTar outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -624,7 +624,7 @@ func (s Service) SetTargetCredentialSources(ctx context.Context, req *pbs.SetTar outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -662,7 +662,7 @@ func (s Service) RemoveTargetCredentialSources(ctx context.Context, req *pbs.Rem outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -885,7 +885,7 @@ HostSetIterationLoop: case static.Subtype: h, err := staticHostRepo.LookupHost(ctx, chosenId.hostId) if err != nil { - return nil, errors.New(errors.InvalidParameter, op, "errors looking up host") + return nil, errors.New(ctx, errors.InvalidParameter, op, "errors looking up host") } endpointHost = h.Address if endpointHost == "" { @@ -941,11 +941,11 @@ HostSetIterationLoop: if len(reqs) > 0 { credRepo, err := s.vaultCredRepoFn() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } cs, err = credRepo.Issue(ctx, sess.GetPublicId(), reqs) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } } @@ -956,7 +956,7 @@ HostSetIterationLoop: // TODO: Access the json directly from the vault response instead of re-marshalling it. jSecret, err := json.Marshal(secret) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("marshalling secret to json")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("marshalling secret to json")) } var sSecret *structpb.Struct switch secret.(type) { @@ -969,11 +969,11 @@ HostSetIterationLoop: // decoder with UseNumber here. var dSecret map[string]interface{} if err := json.Unmarshal(jSecret, &dSecret); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("decoding json for proto marshaling")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("decoding json for proto marshaling")) } sSecret, err = structpb.NewStruct(dSecret) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("creating proto struct for secret")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("creating proto struct for secret")) } } creds = append(creds, &pb.SessionCredential{ @@ -1076,7 +1076,7 @@ func (s Service) createInRepo(ctx context.Context, item *pb.Target) (target.Targ } out, hs, cl, err := repo.CreateTcpTarget(ctx, u) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to create target")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create target")) } if out == nil { return nil, nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to create target but no error returned from repository.") @@ -1125,7 +1125,7 @@ func (s Service) updateInRepo(ctx context.Context, scopeId, id string, mask []st } out, hs, cl, rowsUpdated, err := repo.UpdateTcpTarget(ctx, u, version, dbMask) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to update target")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to update target")) } if rowsUpdated == 0 { return nil, nil, nil, handlers.NotFoundErrorf("Target %q not found or incorrect version provided.", id) @@ -1144,7 +1144,7 @@ func (s Service) deleteFromRepo(ctx context.Context, id string) (bool, error) { if errors.IsNotFoundError(err) { return false, nil } - return false, errors.Wrap(err, op, errors.WithMsg("unable to delete target")) + return false, errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete target")) } return rows > 0, nil } @@ -1191,7 +1191,7 @@ func (s Service) setSetsInRepo(ctx context.Context, targetId string, hostSetIds out, hs, cl, err := repo.LookupTarget(ctx, targetId) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to look up target after setting host sets")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to look up target after setting host sets")) } if out == nil { return nil, nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to lookup target after setting host sets for it.") @@ -1212,7 +1212,7 @@ func (s Service) removeSetsInRepo(ctx context.Context, targetId string, hostSetI } out, hs, cl, err := repo.LookupTarget(ctx, targetId) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to look up target after removing host sets")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to look up target after removing host sets")) } if out == nil { return nil, nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to lookup target after removing host sets from it.") @@ -1250,7 +1250,7 @@ func (s Service) setCredentialSourcesInRepo(ctx context.Context, targetId string out, hs, credSources, err := repo.LookupTarget(ctx, targetId) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to look up target after setting credential sources")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to look up target after setting credential sources")) } if out == nil { return nil, nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to lookup target after setting credential sources for it.") @@ -1271,7 +1271,7 @@ func (s Service) removeCredentialSourcesInRepo(ctx context.Context, targetId str } out, hs, credSources, err := repo.LookupTarget(ctx, targetId) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to look up target after removing credential sources")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to look up target after removing credential sources")) } if out == nil { return nil, nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to lookup target after removing credential sources from it.") @@ -1414,7 +1414,7 @@ func toProto(ctx context.Context, in target.Target, m []*target.TargetSet, credS case credential.IngressPurpose, credential.EgressPurpose: // TODO: When we support other purposes add them to different fields here. default: - return nil, errors.New(errors.Internal, op, fmt.Sprintf("unrecognized purpose %q for credential source on target", cs.CredentialPurpose())) + return nil, errors.New(ctx, errors.Internal, op, fmt.Sprintf("unrecognized purpose %q for credential source on target", cs.CredentialPurpose())) } } } @@ -1429,7 +1429,7 @@ func toProto(ctx context.Context, in target.Target, m []*target.TargetSet, credS case credential.IngressPurpose, credential.EgressPurpose: // TODO: When we support other purposes add them to different fields here. default: - return nil, errors.New(errors.Internal, op, fmt.Sprintf("unrecognized purpose %q for credential source on target", cs.CredentialPurpose())) + return nil, errors.New(ctx, errors.Internal, op, fmt.Sprintf("unrecognized purpose %q for credential source on target", cs.CredentialPurpose())) } } } diff --git a/internal/servers/controller/handlers/users/user_service.go b/internal/servers/controller/handlers/users/user_service.go index fdeb83980..7976a270a 100644 --- a/internal/servers/controller/handlers/users/user_service.go +++ b/internal/servers/controller/handlers/users/user_service.go @@ -67,7 +67,7 @@ type Service struct { func NewService(repo common.IamRepoFactory) (Service, error) { const op = "users.NewService" if repo == nil { - return Service{}, errors.New(errors.InvalidParameter, op, "missing iam repository") + return Service{}, errors.NewDeprecated(errors.InvalidParameter, op, "missing iam repository") } return Service{repoFn: repo}, nil } @@ -166,7 +166,7 @@ func (s Service) GetUser(ctx context.Context, req *pbs.GetUserRequest) (*pbs.Get outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -204,7 +204,7 @@ func (s Service) CreateUser(ctx context.Context, req *pbs.CreateUserRequest) (*p outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -241,7 +241,7 @@ func (s Service) UpdateUser(ctx context.Context, req *pbs.UpdateUserRequest) (*p outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -295,7 +295,7 @@ func (s Service) AddUserAccounts(ctx context.Context, req *pbs.AddUserAccountsRe outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -333,7 +333,7 @@ func (s Service) SetUserAccounts(ctx context.Context, req *pbs.SetUserAccountsRe outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -371,7 +371,7 @@ func (s Service) RemoveUserAccounts(ctx context.Context, req *pbs.RemoveUserAcco outputFields, ok := requests.OutputFields(ctx) if !ok { - return nil, errors.New(errors.Internal, op, "no request context found") + return nil, errors.New(ctx, errors.Internal, op, "no request context found") } outputOpts := make([]handlers.Option, 0, 3) @@ -428,7 +428,7 @@ func (s Service) createInRepo(ctx context.Context, orgId string, item *pb.User) } out, err := repo.CreateUser(ctx, u) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to create user")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create user")) } if out == nil { return nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to create user but no error returned from repository.") @@ -461,7 +461,7 @@ func (s Service) updateInRepo(ctx context.Context, orgId, id string, mask []stri } out, accts, rowsUpdated, err := repo.UpdateUser(ctx, u, version, dbMask) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to update user")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to update user")) } if rowsUpdated == 0 { return nil, nil, handlers.NotFoundErrorf("User %q doesn't exist or incorrect version provided.", id) @@ -480,7 +480,7 @@ func (s Service) deleteFromRepo(ctx context.Context, id string) (bool, error) { if errors.IsNotFoundError(err) { return false, nil } - return false, errors.Wrap(err, op, errors.WithMsg("unable to delete user")) + return false, errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete user")) } return rows > 0, nil } @@ -509,7 +509,7 @@ func (s Service) addInRepo(ctx context.Context, userId string, accountIds []stri } out, accts, err := repo.LookupUser(ctx, userId) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to look up user after adding accounts")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to look up user after adding accounts")) } if out == nil { return nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to lookup user after adding accounts to it.") @@ -529,7 +529,7 @@ func (s Service) setInRepo(ctx context.Context, userId string, accountIds []stri } out, accts, err := repo.LookupUser(ctx, userId) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to look up user after setting accounts")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to look up user after setting accounts")) } if out == nil { return nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to lookup user after setting accounts for it.") @@ -549,7 +549,7 @@ func (s Service) removeInRepo(ctx context.Context, userId string, accountIds []s } out, accts, err := repo.LookupUser(ctx, userId) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to look up user after removing accounts")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to look up user after removing accounts")) } if out == nil { return nil, nil, handlers.ApiErrorWithCodeAndMessage(codes.Internal, "Unable to lookup user after removing accounts from it.") diff --git a/internal/servers/controller/session_cleanup_job.go b/internal/servers/controller/session_cleanup_job.go index 2eea1794c..e8f108d08 100644 --- a/internal/servers/controller/session_cleanup_job.go +++ b/internal/servers/controller/session_cleanup_job.go @@ -44,11 +44,11 @@ func newSessionCleanupJob( const op = "controller.newNewSessionCleanupJob" switch { case logger == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing logger") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing logger") case sessionRepoFn == nil: - return nil, errors.New(errors.InvalidParameter, op, "missing sessionRepoFn") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing sessionRepoFn") case gracePeriod < session.DeadWorkerConnCloseMinGrace: - return nil, errors.New( + return nil, errors.NewDeprecated( errors.InvalidParameter, op, fmt.Sprintf("invalid gracePeriod, must be greater than %d", session.DeadWorkerConnCloseMinGrace)) } @@ -92,13 +92,13 @@ func (j *sessionCleanupJob) Run(ctx context.Context) error { // Load repos. sessionRepo, err := j.sessionRepoFn() if err != nil { - return errors.Wrap(err, op, errors.WithMsg("error getting session repo")) + return errors.Wrap(ctx, err, op, errors.WithMsg("error getting session repo")) } // Run the atomic dead worker cleanup job. results, err := sessionRepo.CloseConnectionsForDeadWorkers(ctx, j.gracePeriod) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if len(results) < 1 { diff --git a/internal/servers/controller/session_cleanup_job_test.go b/internal/servers/controller/session_cleanup_job_test.go index b83dd6753..9365392da 100644 --- a/internal/servers/controller/session_cleanup_job_test.go +++ b/internal/servers/controller/session_cleanup_job_test.go @@ -141,11 +141,13 @@ func TestSessionCleanupJob(t *testing.T) { func TestSessionCleanupJobNewJobErr(t *testing.T) { t.Parallel() + ctx := context.TODO() const op = "controller.newNewSessionCleanupJob" require := require.New(t) job, err := newSessionCleanupJob(nil, nil, 0) require.Equal(err, errors.E( + ctx, errors.WithCode(errors.InvalidParameter), errors.WithOp(op), errors.WithMsg("missing logger"), @@ -154,6 +156,7 @@ func TestSessionCleanupJobNewJobErr(t *testing.T) { job, err = newSessionCleanupJob(hclog.New(nil), nil, 0) require.Equal(err, errors.E( + ctx, errors.WithCode(errors.InvalidParameter), errors.WithOp(op), errors.WithMsg("missing sessionRepoFn"), @@ -162,6 +165,7 @@ func TestSessionCleanupJobNewJobErr(t *testing.T) { job, err = newSessionCleanupJob(hclog.New(nil), func() (*session.Repository, error) { return nil, nil }, 0) require.Equal(err, errors.E( + ctx, errors.WithCode(errors.InvalidParameter), errors.WithOp(op), errors.WithMsg(fmt.Sprintf("invalid gracePeriod, must be greater than %d", session.DeadWorkerConnCloseMinGrace)), diff --git a/internal/servers/controller/testing.go b/internal/servers/controller/testing.go index f5a68e38c..3ca1b522d 100644 --- a/internal/servers/controller/testing.go +++ b/internal/servers/controller/testing.go @@ -589,7 +589,7 @@ func NewTestController(t *testing.T, opts *TestControllerOpts) *TestController { DisableAuthorizationFailures: opts.DisableAuthorizationFailures, } - tc.c, err = New(conf) + tc.c, err = New(ctx, conf) if err != nil { tc.Shutdown() t.Fatal(err) diff --git a/internal/servers/repository.go b/internal/servers/repository.go index c25a2a759..3ca3784d7 100644 --- a/internal/servers/repository.go +++ b/internal/servers/repository.go @@ -47,13 +47,13 @@ type Repository struct { func NewRepository(r db.Reader, w db.Writer, kms *kms.Kms) (*Repository, error) { const op = "servers.NewRepository" if r == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil reader") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil reader") } if w == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil writer") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil writer") } if kms == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil kms") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil kms") } return &Repository{ reader: r, @@ -93,7 +93,7 @@ func (r *Repository) listServersWithReader(ctx context.Context, reader db.Reader []interface{}{serverType}, db.WithLimit(-1), ); err != nil { - return nil, errors.Wrap(err, "servers.listServersWithReader") + return nil, errors.Wrap(ctx, err, "servers.listServersWithReader") } return servers, nil @@ -122,7 +122,7 @@ func (r *Repository) ListTagsForServers(ctx context.Context, serverIds []string, []interface{}{serverIds}, db.WithLimit(-1), ); err != nil { - return nil, errors.Wrap(err, "servers.ListTagsForServers", errors.WithMsg(fmt.Sprintf("server IDs %v", serverIds))) + return nil, errors.Wrap(ctx, err, "servers.ListTagsForServers", errors.WithMsg(fmt.Sprintf("server IDs %v", serverIds))) } return serverTags, nil } @@ -132,7 +132,7 @@ func (r *Repository) UpsertServer(ctx context.Context, server *Server, opt ...Op const op = "servers.UpsertServer" if server == nil { - return nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "server is nil") + return nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "server is nil") } opts := getOpts(opt...) @@ -154,7 +154,7 @@ func (r *Repository) UpsertServer(ctx context.Context, server *Server, opt ...Op server.Address, }) if err != nil { - return errors.Wrap(err, op+":Upsert") + return errors.Wrap(ctx, err, op+":Upsert") } // If it's a worker, fetch the current controllers to feed to them @@ -162,7 +162,7 @@ func (r *Repository) UpsertServer(ctx context.Context, server *Server, opt ...Op // Fetch current controllers to feed to the workers controllers, err = r.listServersWithReader(ctx, read, ServerTypeController) if err != nil { - return errors.Wrap(err, op+":ListServer") + return errors.Wrap(ctx, err, op+":ListServer") } } @@ -173,7 +173,7 @@ func (r *Repository) UpsertServer(ctx context.Context, server *Server, opt ...Op if opts.withUpdateTags { _, err = w.Delete(ctx, &ServerTag{}, db.WithWhere(deleteTagsSql, server.PrivateId)) if err != nil { - return errors.Wrap(err, op+":DeleteTags", errors.WithMsg(server.PrivateId)) + return errors.Wrap(ctx, err, op+":DeleteTags", errors.WithMsg(server.PrivateId)) } // If tags were cleared out entirely, then we'll have nothing @@ -184,7 +184,7 @@ func (r *Repository) UpsertServer(ctx context.Context, server *Server, opt ...Op tags := make([]interface{}, 0, len(server.Tags)) for k, v := range server.Tags { if v == nil { - return errors.New(errors.InvalidParameter, op+":RangeTags", fmt.Sprintf("found nil tag value for worker %s and key %s", server.PrivateId, k)) + return errors.New(ctx, errors.InvalidParameter, op+":RangeTags", fmt.Sprintf("found nil tag value for worker %s and key %s", server.PrivateId, k)) } for _, val := range v.Values { tags = append(tags, ServerTag{ @@ -195,7 +195,7 @@ func (r *Repository) UpsertServer(ctx context.Context, server *Server, opt ...Op } } if err = w.CreateItems(ctx, tags); err != nil { - return errors.Wrap(err, op+":CreateTags", errors.WithMsg(server.PrivateId)) + return errors.Wrap(ctx, err, op+":CreateTags", errors.WithMsg(server.PrivateId)) } } } @@ -218,11 +218,11 @@ type RecoveryNonce struct { func (r *Repository) AddRecoveryNonce(ctx context.Context, nonce string, opt ...Option) error { const op = "servers.AddRecoveryNonce" if nonce == "" { - return errors.New(errors.InvalidParameter, op, "empty nonce") + return errors.New(ctx, errors.InvalidParameter, op, "empty nonce") } rn := &RecoveryNonce{Nonce: nonce} if err := r.writer.Create(ctx, rn); err != nil { - return errors.Wrap(err, op+":Insertion") + return errors.Wrap(ctx, err, op+":Insertion") } return nil } @@ -234,7 +234,7 @@ func (r *Repository) CleanupNonces(ctx context.Context, opt ...Option) (int, err rows, err := r.writer.Delete(ctx, &RecoveryNonce{}, db.WithWhere(deleteWhereCreateTimeSql, endTime)) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, "servers.CleanupNonces") + return db.NoRowsAffected, errors.Wrap(ctx, err, "servers.CleanupNonces") } return rows, nil } @@ -243,7 +243,7 @@ func (r *Repository) CleanupNonces(ctx context.Context, opt ...Option) (int, err func (r *Repository) ListNonces(ctx context.Context, opt ...Option) ([]*RecoveryNonce, error) { var nonces []*RecoveryNonce if err := r.reader.SearchWhere(ctx, &nonces, "", nil, db.WithLimit(-1)); err != nil { - return nil, errors.Wrap(err, "servers.ListNonces") + return nil, errors.Wrap(ctx, err, "servers.ListNonces") } return nonces, nil } diff --git a/internal/session/connection.go b/internal/session/connection.go index 4f963f286..73776d479 100644 --- a/internal/session/connection.go +++ b/internal/session/connection.go @@ -64,7 +64,7 @@ func NewConnection(sessionID, clientTcpAddress string, clientTcpPort uint32, end EndpointTcpPort: endpointTcpPort, } if err := c.validateNewConnection(); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.WrapDeprecated(err, op) } return &c, nil } @@ -109,30 +109,30 @@ func (c *Connection) Clone() interface{} { // VetForWrite implements db.VetForWrite() interface and validates the connection // before it's written. -func (c *Connection) VetForWrite(_ context.Context, _ db.Reader, opType db.OpType, opt ...db.Option) error { +func (c *Connection) VetForWrite(ctx context.Context, _ db.Reader, opType db.OpType, opt ...db.Option) error { const op = "session.(Connection).VetForWrite" opts := db.GetOpts(opt...) if c.PublicId == "" { - return errors.New(errors.InvalidParameter, op, "missing public id") + return errors.New(ctx, errors.InvalidParameter, op, "missing public id") } switch opType { case db.CreateOp: if err := c.validateNewConnection(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } case db.UpdateOp: switch { case contains(opts.WithFieldMaskPaths, "PublicId"): - return errors.New(errors.InvalidParameter, op, "public id is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "public id is immutable") case contains(opts.WithFieldMaskPaths, "SessionId"): - return errors.New(errors.InvalidParameter, op, "session id is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "session id is immutable") case contains(opts.WithFieldMaskPaths, "CreateTime"): - return errors.New(errors.InvalidParameter, op, "create time is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "create time is immutable") case contains(opts.WithFieldMaskPaths, "UpdateTime"): - return errors.New(errors.InvalidParameter, op, "update time is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "update time is immutable") case contains(opts.WithFieldMaskPaths, "ClosedReason"): if _, err := convertToClosedReason(c.ClosedReason); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } } } @@ -158,19 +158,19 @@ func (c *Connection) SetTableName(n string) { func (c *Connection) validateNewConnection() error { const op = "session.(Connection).validateNewConnection" if c.SessionId == "" { - return errors.New(errors.InvalidParameter, op, "missing session id") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing session id") } if c.ClientTcpAddress == "" { - return errors.New(errors.InvalidParameter, op, "missing client address") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing client address") } if c.ClientTcpPort == 0 { - return errors.New(errors.InvalidParameter, op, "missing client port") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing client port") } if c.EndpointTcpAddress == "" { - return errors.New(errors.InvalidParameter, op, "missing endpoint address") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing endpoint address") } if c.EndpointTcpPort == 0 { - return errors.New(errors.InvalidParameter, op, "missing endpoint port") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing endpoint port") } return nil } diff --git a/internal/session/connection_closed_reason.go b/internal/session/connection_closed_reason.go index fe2945ad0..7c48b4218 100644 --- a/internal/session/connection_closed_reason.go +++ b/internal/session/connection_closed_reason.go @@ -39,6 +39,6 @@ func convertToClosedReason(s string) (ClosedReason, error) { case ConnectionSystemError.String(): return ConnectionSystemError, nil default: - return "", errors.New(errors.InvalidParameter, op, fmt.Sprintf("%s is not a valid reason", s)) + return "", errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("%s is not a valid reason", s)) } } diff --git a/internal/session/connection_closed_with.go b/internal/session/connection_closed_with.go index fb25a3f27..018c7827a 100644 --- a/internal/session/connection_closed_with.go +++ b/internal/session/connection_closed_with.go @@ -16,10 +16,10 @@ type CloseWith struct { func (c CloseWith) validate() error { const op = "session.(CloseWith).validate" if c.ConnectionId == "" { - return errors.New(errors.InvalidParameter, op, "missing connection id") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing connection id") } if c.ClosedReason.String() == "" { - return errors.New(errors.InvalidParameter, op, "missing closed reason") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing closed reason") } // 0 is valid for BytesUp and BytesDown return nil diff --git a/internal/session/connection_state.go b/internal/session/connection_state.go index b92b75e49..7285d87e2 100644 --- a/internal/session/connection_state.go +++ b/internal/session/connection_state.go @@ -87,7 +87,7 @@ func NewConnectionState(connectionId string, state ConnectionStatus, _ ...Option Status: state, } if err := s.validate(); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.WrapDeprecated(err, op) } return &s, nil } @@ -133,10 +133,10 @@ func (s *ConnectionState) Clone() interface{} { // VetForWrite implements db.VetForWrite() interface and validates the state // before it's written. -func (s *ConnectionState) VetForWrite(_ context.Context, _ db.Reader, _ db.OpType, _ ...db.Option) error { +func (s *ConnectionState) VetForWrite(ctx context.Context, _ db.Reader, _ db.OpType, _ ...db.Option) error { const op = "session.(ConnectionState).VetForWrite" if err := s.validate(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -160,19 +160,19 @@ func (s *ConnectionState) SetTableName(n string) { func (s *ConnectionState) validate() error { const op = "session.(ConnectionState).validate" if s.Status == "" { - return errors.New(errors.InvalidParameter, op, "missing status") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing status") } if s.ConnectionId == "" { - return errors.New(errors.InvalidParameter, op, "missing connection id") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing connection id") } if s.StartTime != nil { - return errors.New(errors.InvalidParameter, op, "start time is not settable") + return errors.NewDeprecated(errors.InvalidParameter, op, "start time is not settable") } if s.EndTime != nil { - return errors.New(errors.InvalidParameter, op, "end time is not settable") + return errors.NewDeprecated(errors.InvalidParameter, op, "end time is not settable") } if s.PreviousEndTime != nil { - return errors.New(errors.InvalidParameter, op, "previous end time is not settable") + return errors.NewDeprecated(errors.InvalidParameter, op, "previous end time is not settable") } return nil } diff --git a/internal/session/ids.go b/internal/session/ids.go index 3f678c7c0..11de8fff6 100644 --- a/internal/session/ids.go +++ b/internal/session/ids.go @@ -23,7 +23,7 @@ func newId() (string, error) { const op = "session.newId" id, err := db.NewPublicId(SessionPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } @@ -32,7 +32,7 @@ func newStateId() (string, error) { const op = "session.newStateId" id, err := db.NewPublicId(StatePrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } @@ -41,7 +41,7 @@ func newConnectionId() (string, error) { const op = "session.newConnectionId" id, err := db.NewPublicId(ConnectionPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } @@ -50,7 +50,7 @@ func newConnectionStateId() (string, error) { const op = "session.newConnectionStateId" id, err := db.NewPublicId(ConnectionStatePrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } diff --git a/internal/session/repository.go b/internal/session/repository.go index 32713c85d..b4c75ec1e 100644 --- a/internal/session/repository.go +++ b/internal/session/repository.go @@ -29,13 +29,13 @@ type Repository struct { func NewRepository(r db.Reader, w db.Writer, kms *kms.Kms, opt ...Option) (*Repository, error) { const op = "session.NewRepository" if r == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil reader") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil reader") } if w == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil writer") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil writer") } if kms == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil kms") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil kms") } opts := getOpts(opt...) if opts.withLimit == 0 { @@ -69,7 +69,7 @@ func (r *Repository) list(ctx context.Context, resources interface{}, where stri dbOpts = append(dbOpts, db.WithOrder("create_time")) } if err := r.reader.SearchWhere(ctx, resources, where, args, dbOpts...); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -123,10 +123,10 @@ func (r *Repository) convertToSessions(ctx context.Context, sessionsWithState [] if len(workingSession.CtTofuToken) > 0 { databaseWrapper, err := r.kms.GetWrapper(ctx, workingSession.ScopeId, kms.KeyPurposeDatabase) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("unable to get database wrapper")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get database wrapper")) } if err := workingSession.decrypt(ctx, databaseWrapper); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("cannot decrypt session value")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("cannot decrypt session value")) } } else { workingSession.CtTofuToken = nil diff --git a/internal/session/repository_connection.go b/internal/session/repository_connection.go index cfd7b957b..8ea77e728 100644 --- a/internal/session/repository_connection.go +++ b/internal/session/repository_connection.go @@ -22,7 +22,7 @@ var DeadWorkerConnCloseMinGrace = int(servers.DefaultLiveness.Seconds()) func (r *Repository) LookupConnection(ctx context.Context, connectionId string, _ ...Option) (*Connection, []*ConnectionState, error) { const op = "session.(Repository).LookupConnection" if connectionId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing connectionId id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing connectionId id") } connection := AllocConnection() connection.PublicId = connectionId @@ -33,11 +33,11 @@ func (r *Repository) LookupConnection(ctx context.Context, connectionId string, db.ExpBackoff{}, func(read db.Reader, w db.Writer) error { if err := read.LookupById(ctx, &connection); err != nil { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", connectionId))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", connectionId))) } var err error if states, err = fetchConnectionStates(ctx, read, connectionId, db.WithOrder("start_time desc")); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, @@ -46,7 +46,7 @@ func (r *Repository) LookupConnection(ctx context.Context, connectionId string, if errors.IsNotFoundError(err) { return nil, nil, nil } - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } return &connection, states, nil } @@ -56,12 +56,12 @@ func (r *Repository) LookupConnection(ctx context.Context, connectionId string, func (r *Repository) ListConnectionsBySessionId(ctx context.Context, sessionId string, opt ...Option) ([]*Connection, error) { const op = "session.(Repository).ListConnectionsBySessionId" if sessionId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no session ID supplied") + return nil, errors.New(ctx, errors.InvalidParameter, op, "no session ID supplied") } var connections []*Connection err := r.list(ctx, &connections, "session_id = ?", []interface{}{sessionId}, opt...) // pass options, so WithLimit and WithOrder are supported if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return connections, nil } @@ -70,12 +70,12 @@ func (r *Repository) ListConnectionsBySessionId(ctx context.Context, sessionId s func (r *Repository) DeleteConnection(ctx context.Context, publicId string, _ ...Option) (int, error) { const op = "session.(Repository).DeleteConnection" if publicId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing public id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } connection := AllocConnection() connection.PublicId = publicId if err := r.reader.LookupByPublicId(ctx, &connection); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", publicId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", publicId))) } var rowsDeleted int @@ -91,17 +91,17 @@ func (r *Repository) DeleteConnection(ctx context.Context, publicId string, _ .. deleteConnection, ) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { // return err, which will result in a rollback of the delete - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", publicId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", publicId))) } return rowsDeleted, nil } @@ -117,7 +117,7 @@ func (r *Repository) DeleteConnection(ctx context.Context, publicId string, _ .. func (r *Repository) CloseDeadConnectionsForWorker(ctx context.Context, serverId string, foundConns []string) (int, error) { const op = "session.(Repository).CloseDeadConnectionsForWorker" if serverId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing server id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing server id") } args := make([]interface{}, 0, len(foundConns)+1) @@ -142,13 +142,13 @@ func (r *Repository) CloseDeadConnectionsForWorker(ctx context.Context, serverId var err error rowsAffected, err = w.Exec(ctx, fmt.Sprintf(closeDeadConnectionsCte, publicIdStr), args) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op) + return db.NoRowsAffected, errors.Wrap(ctx, err, op) } return rowsAffected, nil } @@ -168,7 +168,7 @@ type CloseConnectionsForDeadWorkersResult struct { func (r *Repository) CloseConnectionsForDeadWorkers(ctx context.Context, gracePeriod int) ([]CloseConnectionsForDeadWorkersResult, error) { const op = "session.(Repository).CloseConnectionsForDeadWorkers" if gracePeriod < DeadWorkerConnCloseMinGrace { - return nil, errors.New( + return nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("gracePeriod must be at least %d seconds", DeadWorkerConnCloseMinGrace)) } @@ -180,14 +180,14 @@ func (r *Repository) CloseConnectionsForDeadWorkers(ctx context.Context, gracePe func(reader db.Reader, w db.Writer) error { rows, err := w.Query(ctx, closeConnectionsForDeadServersCte, []interface{}{gracePeriod}) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } defer rows.Close() for rows.Next() { var result CloseConnectionsForDeadWorkersResult if err := w.ScanRows(rows, &result); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } results = append(results, result) @@ -197,7 +197,7 @@ func (r *Repository) CloseConnectionsForDeadWorkers(ctx context.Context, gracePe }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return results, nil @@ -249,7 +249,7 @@ func (r *Repository) ShouldCloseConnectionsOnWorker(ctx context.Context, foundCo args, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } defer rows.Close() @@ -257,7 +257,7 @@ func (r *Repository) ShouldCloseConnectionsOnWorker(ctx context.Context, foundCo for rows.Next() { var connectionId, sessionId string if err := rows.Scan(&connectionId, &sessionId); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } result[sessionId] = append(result[sessionId], connectionId) @@ -270,7 +270,7 @@ func fetchConnectionStates(ctx context.Context, r db.Reader, connectionId string const op = "session.fetchConnectionStates" var states []*ConnectionState if err := r.SearchWhere(ctx, &states, "connection_id = ?", []interface{}{connectionId}, opt...); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if len(states) == 0 { return nil, nil diff --git a/internal/session/repository_connection_test.go b/internal/session/repository_connection_test.go index 960e51584..106ab50b3 100644 --- a/internal/session/repository_connection_test.go +++ b/internal/session/repository_connection_test.go @@ -512,7 +512,7 @@ func TestRepository_CloseConnectionsForDeadWorkers(t *testing.T) { { // First, test the error/validation case. result, err := repo.CloseConnectionsForDeadWorkers(ctx, 0) - require.Equal(err, errors.E( + require.Equal(err, errors.E(ctx, errors.WithCode(errors.InvalidParameter), errors.WithOp("session.(Repository).CloseConnectionsForDeadWorkers"), errors.WithMsg(fmt.Sprintf("gracePeriod must be at least %d seconds", DeadWorkerConnCloseMinGrace)), diff --git a/internal/session/repository_session.go b/internal/session/repository_session.go index 9cb3d0289..2c5ec397b 100644 --- a/internal/session/repository_session.go +++ b/internal/session/repository_session.go @@ -23,56 +23,56 @@ import ( func (r *Repository) CreateSession(ctx context.Context, sessionWrapper wrapping.Wrapper, newSession *Session, _ ...Option) (*Session, ed25519.PrivateKey, error) { const op = "session.(Repository).CreateSession" if newSession == nil { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing session") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing session") } if newSession.PublicId != "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "public id is not empty") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "public id is not empty") } if len(newSession.Certificate) != 0 { - return nil, nil, errors.New(errors.InvalidParameter, op, "certificate is not empty") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "certificate is not empty") } if newSession.TargetId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing target id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing target id") } if newSession.HostId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing host id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing host id") } if newSession.UserId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing user id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing user id") } if newSession.HostSetId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing host set id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing host set id") } if newSession.AuthTokenId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing auth token id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing auth token id") } if newSession.ScopeId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } if newSession.ServerId != "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "server id is not empty") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "server id is not empty") } if newSession.ServerType != "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "server type is not empty") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "server type is not empty") } if newSession.CtTofuToken != nil { - return nil, nil, errors.New(errors.InvalidParameter, op, "ct is not empty") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "ct is not empty") } if newSession.TofuToken != nil { - return nil, nil, errors.New(errors.InvalidParameter, op, "tofu token is not empty") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "tofu token is not empty") } if newSession.ExpirationTime == nil || newSession.ExpirationTime.Timestamp.AsTime().IsZero() { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing expiration time") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing expiration time") } id, err := newId() if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } - privKey, certBytes, err := newCert(sessionWrapper, newSession.UserId, id, newSession.ExpirationTime.Timestamp.AsTime()) + privKey, certBytes, err := newCert(ctx, sessionWrapper, newSession.UserId, id, newSession.ExpirationTime.Timestamp.AsTime()) if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } newSession.Certificate = certBytes newSession.PublicId = id @@ -87,36 +87,36 @@ func (r *Repository) CreateSession(ctx context.Context, sessionWrapper wrapping. returnedSession = newSession.Clone().(*Session) returnedSession.DynamicCredentials = nil if err = w.Create(ctx, returnedSession); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } for _, cred := range newSession.DynamicCredentials { cred.SessionId = newSession.PublicId returnedCred := cred.clone() if err = w.Create(ctx, returnedCred); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } returnedSession.DynamicCredentials = append(returnedSession.DynamicCredentials, returnedCred) } var foundStates []*State // trigger will create new "Pending" state if foundStates, err = fetchStates(ctx, read, returnedSession.PublicId); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if len(foundStates) != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("%d states found for new session %s", len(foundStates), returnedSession.PublicId)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("%d states found for new session %s", len(foundStates), returnedSession.PublicId)) } if len(foundStates) == 0 { - return errors.New(errors.SessionNotFound, op, fmt.Sprintf("no states found for new session %s", returnedSession.PublicId)) + return errors.New(ctx, errors.SessionNotFound, op, fmt.Sprintf("no states found for new session %s", returnedSession.PublicId)) } returnedSession.States = foundStates if returnedSession.States[0].Status != StatusPending { - return errors.New(errors.InvalidSessionState, op, fmt.Sprintf("new session %s state is not valid: %s", returnedSession.PublicId, returnedSession.States[0].Status)) + return errors.New(ctx, errors.InvalidSessionState, op, fmt.Sprintf("new session %s state is not valid: %s", returnedSession.PublicId, returnedSession.States[0].Status)) } return nil }, ) if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } return returnedSession, privKey, nil } @@ -128,7 +128,7 @@ func (r *Repository) CreateSession(ctx context.Context, sessionWrapper wrapping. func (r *Repository) LookupSession(ctx context.Context, sessionId string, _ ...Option) (*Session, *ConnectionAuthzSummary, error) { const op = "session.(Repository).LookupSession" if sessionId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing session id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing session id") } session := AllocSession() session.PublicId = sessionId @@ -138,17 +138,17 @@ func (r *Repository) LookupSession(ctx context.Context, sessionId string, _ ...O db.ExpBackoff{}, func(read db.Reader, w db.Writer) error { if err := read.LookupById(ctx, &session); err != nil { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", sessionId))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", sessionId))) } states, err := fetchStates(ctx, read, sessionId, db.WithOrder("start_time desc")) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } session.States = states var creds []*DynamicCredential if err := read.SearchWhere(ctx, &creds, "session_id = ?", []interface{}{sessionId}); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if len(creds) > 0 { session.DynamicCredentials = creds @@ -160,15 +160,15 @@ func (r *Repository) LookupSession(ctx context.Context, sessionId string, _ ...O if errors.IsNotFoundError(err) { return nil, nil, nil } - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } if len(session.CtTofuToken) > 0 { databaseWrapper, err := r.kms.GetWrapper(ctx, session.ScopeId, kms.KeyPurposeDatabase) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to get database wrapper")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get database wrapper")) } if err := session.decrypt(ctx, databaseWrapper); err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("cannot decrypt session value")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("cannot decrypt session value")) } } else { session.CtTofuToken = nil @@ -176,7 +176,7 @@ func (r *Repository) LookupSession(ctx context.Context, sessionId string, _ ...O authzSummary, err := r.sessionAuthzSummary(ctx, sessionId) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("failed to get authz summary")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("failed to get authz summary")) } return &session, authzSummary, nil @@ -248,7 +248,7 @@ func (r *Repository) ListSessions(ctx context.Context, opt ...Option) ([]*Sessio rows, err := r.reader.Query(ctx, query, args) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } defer rows.Close() @@ -256,13 +256,13 @@ func (r *Repository) ListSessions(ctx context.Context, opt ...Option) ([]*Sessio for rows.Next() { var s sessionView if err := r.reader.ScanRows(rows, &s); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("scan row failed")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("scan row failed")) } sessionsWithState = append(sessionsWithState, &s) } sessions, err := r.convertToSessions(ctx, sessionsWithState, withListingConvert(true)) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return sessions, nil } @@ -271,12 +271,12 @@ func (r *Repository) ListSessions(ctx context.Context, opt ...Option) ([]*Sessio func (r *Repository) DeleteSession(ctx context.Context, publicId string, _ ...Option) (int, error) { const op = "session.(Repository).DeleteSession" if publicId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing public id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } session := AllocSession() session.PublicId = publicId if err := r.reader.LookupByPublicId(ctx, &session); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", publicId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", publicId))) } var rowsDeleted int @@ -292,17 +292,17 @@ func (r *Repository) DeleteSession(ctx context.Context, publicId string, _ ...Op deleteSession, ) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { // return err, which will result in a rollback of the delete - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", publicId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", publicId))) } return rowsDeleted, nil } @@ -315,14 +315,14 @@ func (r *Repository) DeleteSession(ctx context.Context, publicId string, _ ...Op func (r *Repository) CancelSession(ctx context.Context, sessionId string, sessionVersion uint32) (*Session, error) { const op = "session.(Repository).CancelSession" if sessionId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing session id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing session id") } if sessionVersion == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing session version") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing session version") } s, ss, err := r.updateState(ctx, sessionId, sessionVersion, StatusCanceling) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } s.States = ss return s, nil @@ -334,10 +334,10 @@ func (r *Repository) CancelSession(ctx context.Context, sessionId string, sessio func (r *Repository) TerminateSession(ctx context.Context, sessionId string, sessionVersion uint32, reason TerminationReason) (*Session, error) { const op = "session.(Repository).TerminateSession" if sessionId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing session id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing session id") } if sessionVersion == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing session version") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing session version") } updatedSession := AllocSession() @@ -350,28 +350,28 @@ func (r *Repository) TerminateSession(ctx context.Context, sessionId string, ses func(reader db.Reader, w db.Writer) error { rowsAffected, err := w.Exec(ctx, terminateSessionCte, []interface{}{sessionId, sessionVersion}) if err != nil { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to terminate session %s", sessionId))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to terminate session %s", sessionId))) } if rowsAffected == 0 { - return errors.New(errors.InvalidSessionState, op, fmt.Sprintf("unable to terminate session %s", sessionId)) + return errors.New(ctx, errors.InvalidSessionState, op, fmt.Sprintf("unable to terminate session %s", sessionId)) } rowsUpdated, err := w.Update(ctx, &updatedSession, []string{"TerminationReason"}, nil, db.WithVersion(&sessionVersion)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", sessionId))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", sessionId))) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("update to session %s would have updated %d session", updatedSession.PublicId, rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("update to session %s would have updated %d session", updatedSession.PublicId, rowsUpdated)) } states, err := fetchStates(ctx, reader, sessionId, db.WithOrder("start_time desc")) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } updatedSession.States = states return nil }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return &updatedSession, nil } @@ -393,13 +393,13 @@ func (r *Repository) TerminateCompletedSessions(ctx context.Context) (int, error var err error rowsAffected, err = w.Exec(ctx, termSessionsUpdate, nil) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op) + return db.NoRowsAffected, errors.Wrap(ctx, err, op) } return rowsAffected, nil } @@ -414,11 +414,11 @@ func (r *Repository) TerminateCompletedSessions(ctx context.Context) (int, error func (r *Repository) AuthorizeConnection(ctx context.Context, sessionId, workerId string) (*Connection, []*ConnectionState, *ConnectionAuthzSummary, error) { const op = "session.(Repository).AuthorizeConnection" if sessionId == "" { - return nil, nil, nil, errors.Wrap(status.Error(codes.FailedPrecondition, "missing session id"), op, errors.WithCode(errors.InvalidParameter)) + return nil, nil, nil, errors.Wrap(ctx, status.Error(codes.FailedPrecondition, "missing session id"), op, errors.WithCode(errors.InvalidParameter)) } connectionId, err := newConnectionId() if err != nil { - return nil, nil, nil, errors.Wrap(err, op) + return nil, nil, nil, errors.Wrap(ctx, err, op) } connection := AllocConnection() @@ -431,27 +431,27 @@ func (r *Repository) AuthorizeConnection(ctx context.Context, sessionId, workerI func(reader db.Reader, w db.Writer) error { rowsAffected, err := w.Exec(ctx, authorizeConnectionCte, []interface{}{sessionId, connectionId, workerId}) if err != nil { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to authorize connection %s", sessionId))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to authorize connection %s", sessionId))) } if rowsAffected == 0 { - return errors.Wrap(status.Errorf(codes.PermissionDenied, "session %s is not authorized (not active, expired or connection limit reached)", sessionId), op, errors.WithCode(errors.InvalidSessionState)) + return errors.Wrap(ctx, status.Errorf(codes.PermissionDenied, "session %s is not authorized (not active, expired or connection limit reached)", sessionId), op, errors.WithCode(errors.InvalidSessionState)) } if err := reader.LookupById(ctx, &connection); err != nil { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for session %s", sessionId))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for session %s", sessionId))) } connectionStates, err = fetchConnectionStates(ctx, reader, connectionId, db.WithOrder("start_time desc")) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { - return nil, nil, nil, errors.Wrap(err, op) + return nil, nil, nil, errors.Wrap(ctx, err, op) } authzSummary, err := r.sessionAuthzSummary(ctx, connection.SessionId) if err != nil { - return nil, nil, nil, errors.Wrap(err, op) + return nil, nil, nil, errors.Wrap(ctx, err, op) } return &connection, connectionStates, authzSummary, nil } @@ -466,18 +466,18 @@ func (r *Repository) sessionAuthzSummary(ctx context.Context, sessionId string) const op = "session.(Repository).sessionAuthzSummary" rows, err := r.reader.Query(ctx, remainingConnectionsCte, []interface{}{sessionId}) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } defer rows.Close() var info *ConnectionAuthzSummary for rows.Next() { if info != nil { - return nil, errors.New(errors.MultipleRecords, op, "query returned more than one row") + return nil, errors.New(ctx, errors.MultipleRecords, op, "query returned more than one row") } info = &ConnectionAuthzSummary{} if err := r.reader.ScanRows(rows, info); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("scan row failed")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("scan row failed")) } } return info, nil @@ -488,7 +488,7 @@ func (r *Repository) ConnectConnection(ctx context.Context, c ConnectWith) (*Con const op = "session.(Repository).ConnectConnection" // ConnectWith.validate will check all the fields... if err := c.validate(); err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } var connection Connection var connectionStates []*ConnectionState @@ -511,28 +511,28 @@ func (r *Repository) ConnectConnection(ctx context.Context, c ConnectWith) (*Con } rowsUpdated, err := w.Update(ctx, &connection, fieldMask, nil) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if err == nil && rowsUpdated > 1 { // return err, which will result in a rollback of the update - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been updated") } newState, err := NewConnectionState(connection.PublicId, StatusConnected) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if err := w.Create(ctx, newState); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } connectionStates, err = fetchConnectionStates(ctx, reader, c.ConnectionId, db.WithOrder("start_time desc")) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } return &connection, connectionStates, nil } @@ -550,11 +550,11 @@ type CloseConnectionResp struct { func (r *Repository) CloseConnections(ctx context.Context, closeWith []CloseWith, _ ...Option) ([]CloseConnectionResp, error) { const op = "session.(Repository).CloseConnections" if len(closeWith) == 0 { - return nil, errors.New(errors.InvalidParameter, op, "missing connections") + return nil, errors.New(ctx, errors.InvalidParameter, op, "missing connections") } for _, cw := range closeWith { if err := cw.validate(); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("%s was invalid", cw.ConnectionId))) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("%s was invalid", cw.ConnectionId))) } } var resp []CloseConnectionResp @@ -578,14 +578,14 @@ func (r *Repository) CloseConnections(ctx context.Context, closeWith []CloseWith nil, ) if err != nil { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to update connection %s", cw.ConnectionId))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to update connection %s", cw.ConnectionId))) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("%d would have been updated for connection %s", rowsUpdated, cw.ConnectionId)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("%d would have been updated for connection %s", rowsUpdated, cw.ConnectionId)) } states, err := fetchConnectionStates(ctx, reader, cw.ConnectionId, db.WithOrder("start_time desc")) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } resp = append(resp, CloseConnectionResp{ Connection: &updateConnection, @@ -597,7 +597,7 @@ func (r *Repository) CloseConnections(ctx context.Context, closeWith []CloseWith }, ) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } return resp, nil } @@ -610,19 +610,19 @@ func (r *Repository) CloseConnections(ctx context.Context, closeWith []CloseWith func (r *Repository) ActivateSession(ctx context.Context, sessionId string, sessionVersion uint32, serverId, serverType string, tofuToken []byte) (*Session, []*State, error) { const op = "session.(Repository).ActivateSession" if sessionId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing session id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing session id") } if sessionVersion == 0 { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing version") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing version") } if serverId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing server id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing server id") } if serverType == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing server type") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing server type") } if len(tofuToken) == 0 { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing tofu token") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing tofu token") } updatedSession := AllocSession() @@ -635,48 +635,48 @@ func (r *Repository) ActivateSession(ctx context.Context, sessionId string, sess func(reader db.Reader, w db.Writer) error { rowsAffected, err := w.Exec(ctx, activateStateCte, []interface{}{sessionId, sessionVersion}) if err != nil { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to activate session %s", sessionId))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to activate session %s", sessionId))) } if rowsAffected == 0 { - return errors.New(errors.InvalidSessionState, op, "session is not in a pending state") + return errors.New(ctx, errors.InvalidSessionState, op, "session is not in a pending state") } foundSession := AllocSession() foundSession.PublicId = sessionId if err := reader.LookupById(ctx, &foundSession); err != nil { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", sessionId))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", sessionId))) } databaseWrapper, err := r.kms.GetWrapper(ctx, foundSession.ScopeId, kms.KeyPurposeDatabase) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get database wrapper")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get database wrapper")) } if len(foundSession.TofuToken) > 0 && subtle.ConstantTimeCompare(foundSession.TofuToken, tofuToken) != 1 { - return errors.New(errors.TokenMismatch, op, "tofu token mismatch") + return errors.New(ctx, errors.TokenMismatch, op, "tofu token mismatch") } updatedSession.TofuToken = tofuToken updatedSession.ServerId = serverId updatedSession.ServerType = serverType if err := updatedSession.encrypt(ctx, databaseWrapper); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } rowsUpdated, err := w.Update(ctx, &updatedSession, []string{"CtTofuToken"}, nil) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if err == nil && rowsUpdated > 1 { // return err, which will result in a rollback of the update - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been updated") } returnedStates, err = fetchStates(ctx, reader, sessionId, db.WithOrder("start_time desc")) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } return &updatedSession, returnedStates, nil } @@ -687,16 +687,16 @@ func (r *Repository) ActivateSession(ctx context.Context, sessionId string, sess func (r *Repository) updateState(ctx context.Context, sessionId string, sessionVersion uint32, s Status, _ ...Option) (*Session, []*State, error) { const op = "session.(Repository).updateState" if sessionId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing session id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing session id") } if sessionVersion == 0 { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing version") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing version") } if s == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing session status") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing session status") } if s == StatusActive { - return nil, nil, errors.New(errors.InvalidParameter, op, "you must call ActivateSession to update a session's state to active") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "you must call ActivateSession to update a session's state to active") } var rowsAffected int @@ -713,18 +713,18 @@ func (r *Repository) updateState(ctx context.Context, sessionId string, sessionV updatedSession.Version = uint32(sessionVersion) + 1 rowsUpdated, err := w.Update(ctx, &updatedSession, []string{"Version"}, nil, db.WithVersion(&sessionVersion)) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated session and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated session and %d rows updated", rowsUpdated)) } if len(updatedSession.CtTofuToken) > 0 { databaseWrapper, err := r.kms.GetWrapper(ctx, updatedSession.ScopeId, kms.KeyPurposeDatabase) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get database wrapper")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get database wrapper")) } if err := updatedSession.decrypt(ctx, databaseWrapper); err != nil { - return errors.Wrap(err, op, errors.WithMsg("cannot decrypt session value")) + return errors.Wrap(ctx, err, op, errors.WithMsg("cannot decrypt session value")) } } else { updatedSession.CtTofuToken = nil @@ -732,23 +732,23 @@ func (r *Repository) updateState(ctx context.Context, sessionId string, sessionV rowsAffected, err = w.Exec(ctx, updateSessionState, []interface{}{sessionId, s.String()}) if err != nil { - return errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("unable to update session %s state to %s", sessionId, s.String()))) + return errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("unable to update session %s state to %s", sessionId, s.String()))) } if rowsAffected != 0 && rowsAffected != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated session %s to state %s and %d rows inserted (should be 0 or 1)", sessionId, s.String(), rowsAffected)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated session %s to state %s and %d rows inserted (should be 0 or 1)", sessionId, s.String(), rowsAffected)) } returnedStates, err = fetchStates(ctx, reader, sessionId, db.WithOrder("start_time desc")) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if len(returnedStates) < 1 && returnedStates[0].Status != s { - return errors.New(errors.InvalidSessionState, op, fmt.Sprintf("failed to update %s to a state of %s", sessionId, s.String())) + return errors.New(ctx, errors.InvalidSessionState, op, fmt.Sprintf("failed to update %s to a state of %s", sessionId, s.String())) } return nil }, ) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithMsg("error creating new state")) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("error creating new state")) } return &updatedSession, returnedStates, nil } @@ -757,7 +757,7 @@ func fetchStates(ctx context.Context, r db.Reader, sessionId string, opt ...db.O const op = "session.fetchStates" var states []*State if err := r.SearchWhere(ctx, &states, "session_id = ?", []interface{}{sessionId}, opt...); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if len(states) == 0 { return nil, nil diff --git a/internal/session/session.go b/internal/session/session.go index 8fedf3d3b..514028cbf 100644 --- a/internal/session/session.go +++ b/internal/session/session.go @@ -141,7 +141,7 @@ func New(c ComposedOf, _ ...Option) (*Session, error) { DynamicCredentials: c.DynamicCredentials, } if err := s.validateNewSession(); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.WrapDeprecated(err, op) } return &s, nil } @@ -225,53 +225,53 @@ func (s *Session) Clone() interface{} { // VetForWrite implements db.VetForWrite() interface and validates the session // before it's written. -func (s *Session) VetForWrite(_ context.Context, _ db.Reader, opType db.OpType, opt ...db.Option) error { +func (s *Session) VetForWrite(ctx context.Context, _ db.Reader, opType db.OpType, opt ...db.Option) error { const op = "session.(Session).VetForWrite" opts := db.GetOpts(opt...) if s.PublicId == "" { - return errors.New(errors.InvalidParameter, op, "missing public id") + return errors.New(ctx, errors.InvalidParameter, op, "missing public id") } switch opType { case db.CreateOp: if err := s.validateNewSession(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if len(s.Certificate) == 0 { - return errors.New(errors.InvalidParameter, op, "missing certificate") + return errors.New(ctx, errors.InvalidParameter, op, "missing certificate") } case db.UpdateOp: switch { case contains(opts.WithFieldMaskPaths, "PublicId"): - return errors.New(errors.InvalidParameter, op, "public id is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "public id is immutable") case contains(opts.WithFieldMaskPaths, "UserId"): - return errors.New(errors.InvalidParameter, op, "user id is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "user id is immutable") case contains(opts.WithFieldMaskPaths, "HostId"): - return errors.New(errors.InvalidParameter, op, "host id is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "host id is immutable") case contains(opts.WithFieldMaskPaths, "TargetId"): - return errors.New(errors.InvalidParameter, op, "target id is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "target id is immutable") case contains(opts.WithFieldMaskPaths, "HostSetId"): - return errors.New(errors.InvalidParameter, op, "host set id is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "host set id is immutable") case contains(opts.WithFieldMaskPaths, "AuthTokenId"): - return errors.New(errors.InvalidParameter, op, "auth token id is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "auth token id is immutable") case contains(opts.WithFieldMaskPaths, "Certificate"): - return errors.New(errors.InvalidParameter, op, "certificate is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "certificate is immutable") case contains(opts.WithFieldMaskPaths, "CreateTime"): - return errors.New(errors.InvalidParameter, op, "create time is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "create time is immutable") case contains(opts.WithFieldMaskPaths, "UpdateTime"): - return errors.New(errors.InvalidParameter, op, "update time is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "update time is immutable") case contains(opts.WithFieldMaskPaths, "Endpoint"): - return errors.New(errors.InvalidParameter, op, "endpoint is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "endpoint is immutable") case contains(opts.WithFieldMaskPaths, "ExpirationTime"): - return errors.New(errors.InvalidParameter, op, "expiration time is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "expiration time is immutable") case contains(opts.WithFieldMaskPaths, "ConnectionLimit"): - return errors.New(errors.InvalidParameter, op, "connection limit is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "connection limit is immutable") case contains(opts.WithFieldMaskPaths, "WorkerFilter"): - return errors.New(errors.InvalidParameter, op, "worker filter is immutable") + return errors.New(ctx, errors.InvalidParameter, op, "worker filter is immutable") case contains(opts.WithFieldMaskPaths, "DynamicCredentials"): - return errors.New(errors.InvalidParameter, op, "dynamic credentials are immutable") + return errors.New(ctx, errors.InvalidParameter, op, "dynamic credentials are immutable") case contains(opts.WithFieldMaskPaths, "TerminationReason"): if _, err := convertToReason(s.TerminationReason); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } } } @@ -297,43 +297,43 @@ func (s *Session) SetTableName(n string) { func (s *Session) validateNewSession() error { const op = "session.(Session).validateNewSession" if s.UserId == "" { - return errors.New(errors.InvalidParameter, op, "missing user id") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing user id") } if s.HostId == "" { - return errors.New(errors.InvalidParameter, op, "missing host id") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing host id") } if s.TargetId == "" { - return errors.New(errors.InvalidParameter, op, "missing target id") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing target id") } if s.HostSetId == "" { - return errors.New(errors.InvalidParameter, op, "missing host set id") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing host set id") } if s.AuthTokenId == "" { - return errors.New(errors.InvalidParameter, op, "missing auth token id") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing auth token id") } if s.ScopeId == "" { - return errors.New(errors.InvalidParameter, op, "missing scope id") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing scope id") } if s.Endpoint == "" { - return errors.New(errors.InvalidParameter, op, "missing endpoint") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing endpoint") } if s.ExpirationTime.GetTimestamp().AsTime().IsZero() { - return errors.New(errors.InvalidParameter, op, "missing expiration time") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing expiration time") } if s.TerminationReason != "" { - return errors.New(errors.InvalidParameter, op, "termination reason must be empty") + return errors.NewDeprecated(errors.InvalidParameter, op, "termination reason must be empty") } if s.ServerId != "" { - return errors.New(errors.InvalidParameter, op, "server id must be empty") + return errors.NewDeprecated(errors.InvalidParameter, op, "server id must be empty") } if s.ServerType != "" { - return errors.New(errors.InvalidParameter, op, "server type must be empty") + return errors.NewDeprecated(errors.InvalidParameter, op, "server type must be empty") } if s.TofuToken != nil { - return errors.New(errors.InvalidParameter, op, "tofu token must be empty") + return errors.NewDeprecated(errors.InvalidParameter, op, "tofu token must be empty") } if s.CtTofuToken != nil { - return errors.New(errors.InvalidParameter, op, "ct must be empty") + return errors.NewDeprecated(errors.InvalidParameter, op, "ct must be empty") } // It is okay for the worker filter to be empty, so it is not checked here. return nil @@ -348,20 +348,20 @@ func contains(ss []string, t string) bool { return false } -func newCert(wrapper wrapping.Wrapper, userId, jobId string, exp time.Time) (ed25519.PrivateKey, []byte, error) { +func newCert(ctx context.Context, wrapper wrapping.Wrapper, userId, jobId string, exp time.Time) (ed25519.PrivateKey, []byte, error) { const op = "session.newCert" if wrapper == nil { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing wrapper") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing wrapper") } if userId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing user id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing user id") } if jobId == "" { - return nil, nil, errors.New(errors.InvalidParameter, op, "missing job id") + return nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing job id") } pubKey, privKey, err := DeriveED25519Key(wrapper, userId, jobId) if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.Wrap(ctx, err, op) } template := &x509.Certificate{ ExtKeyUsage: []x509.ExtKeyUsage{ @@ -379,7 +379,7 @@ func newCert(wrapper wrapping.Wrapper, userId, jobId string, exp time.Time) (ed2 certBytes, err := x509.CreateCertificate(rand.Reader, template, template, pubKey, privKey) if err != nil { - return nil, nil, errors.Wrap(err, op, errors.WithCode(errors.GenCert)) + return nil, nil, errors.Wrap(ctx, err, op, errors.WithCode(errors.GenCert)) } return privKey, certBytes, nil } @@ -387,7 +387,7 @@ func newCert(wrapper wrapping.Wrapper, userId, jobId string, exp time.Time) (ed2 func (s *Session) encrypt(ctx context.Context, cipher wrapping.Wrapper) error { const op = "session.(Session).encrypt" if err := structwrapping.WrapStruct(ctx, cipher, s, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Encrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Encrypt)) } s.KeyId = cipher.KeyID() return nil @@ -396,7 +396,7 @@ func (s *Session) encrypt(ctx context.Context, cipher wrapping.Wrapper) error { func (s *Session) decrypt(ctx context.Context, cipher wrapping.Wrapper) error { const op = "session.(Session).decrypt" if err := structwrapping.UnwrapStruct(ctx, cipher, s, nil); err != nil { - return errors.Wrap(err, op, errors.WithCode(errors.Decrypt)) + return errors.Wrap(ctx, err, op, errors.WithCode(errors.Decrypt)) } return nil } diff --git a/internal/session/session_connect_with.go b/internal/session/session_connect_with.go index 1e1fc3253..4cb00e076 100644 --- a/internal/session/session_connect_with.go +++ b/internal/session/session_connect_with.go @@ -17,19 +17,19 @@ type ConnectWith struct { func (c ConnectWith) validate() error { const op = "session.(ConnectWith).validate" if c.ConnectionId == "" { - return errors.New(errors.InvalidParameter, op, "missing session id") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing session id") } if c.ClientTcpAddress == "" { - return errors.New(errors.InvalidParameter, op, "missing client tcp address") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing client tcp address") } if c.ClientTcpPort == 0 { - return errors.New(errors.InvalidParameter, op, "missing client ctp port") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing client ctp port") } if c.EndpointTcpAddress == "" { - return errors.New(errors.InvalidParameter, op, "missing endpoint tcp address") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing endpoint tcp address") } if c.EndpointTcpPort == 0 { - return errors.New(errors.InvalidParameter, op, "missing endpoint ctp port") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing endpoint ctp port") } return nil } diff --git a/internal/session/session_test.go b/internal/session/session_test.go index ee391c9ee..334f48aba 100644 --- a/internal/session/session_test.go +++ b/internal/session/session_test.go @@ -131,6 +131,7 @@ func TestSession_Create(t *testing.T) { } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { + ctx := context.Background() assert, require := assert.New(t), require.New(t) got, err := New(tt.args.composedOf) if tt.wantErr { @@ -144,10 +145,10 @@ func TestSession_Create(t *testing.T) { id, err := db.NewPublicId(SessionPrefix) require.NoError(err) got.PublicId = id - _, certBytes, err := newCert(wrapper, got.UserId, id, composedOf.ExpirationTime.Timestamp.AsTime()) + _, certBytes, err := newCert(ctx, wrapper, got.UserId, id, composedOf.ExpirationTime.Timestamp.AsTime()) require.NoError(err) got.Certificate = certBytes - err = db.New(conn).Create(context.Background(), got) + err = db.New(conn).Create(ctx, got) if tt.wantCreateErr { assert.Error(err) return diff --git a/internal/session/state.go b/internal/session/state.go index 9e9e9e09f..53709c9c9 100644 --- a/internal/session/state.go +++ b/internal/session/state.go @@ -76,7 +76,7 @@ func NewState(session_id string, state Status, _ ...Option) (*State, error) { } if err := s.validate(); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.WrapDeprecated(err, op) } return &s, nil } @@ -122,10 +122,10 @@ func (s *State) Clone() interface{} { // VetForWrite implements db.VetForWrite() interface and validates the state // before it's written. -func (s *State) VetForWrite(_ context.Context, _ db.Reader, _ db.OpType, _ ...db.Option) error { +func (s *State) VetForWrite(ctx context.Context, _ db.Reader, _ db.OpType, _ ...db.Option) error { const op = "session.(State).VetForWrite" if err := s.validate(); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -149,19 +149,19 @@ func (s *State) SetTableName(n string) { func (s *State) validate() error { const op = "session.(State).validate" if s.Status == "" { - return errors.New(errors.InvalidParameter, op, "missing status") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing status") } if s.SessionId == "" { - return errors.New(errors.InvalidParameter, op, "missing session id") + return errors.NewDeprecated(errors.InvalidParameter, op, "missing session id") } if s.StartTime != nil { - return errors.New(errors.InvalidParameter, op, "start time is not settable") + return errors.NewDeprecated(errors.InvalidParameter, op, "start time is not settable") } if s.EndTime != nil { - return errors.New(errors.InvalidParameter, op, "end time is not settable") + return errors.NewDeprecated(errors.InvalidParameter, op, "end time is not settable") } if s.PreviousEndTime != nil { - return errors.New(errors.InvalidParameter, op, "previous end time is not settable") + return errors.NewDeprecated(errors.InvalidParameter, op, "previous end time is not settable") } return nil } diff --git a/internal/session/term_reason.go b/internal/session/term_reason.go index 6e75b1f6d..267bee95b 100644 --- a/internal/session/term_reason.go +++ b/internal/session/term_reason.go @@ -43,6 +43,6 @@ func convertToReason(s string) (TerminationReason, error) { case ConnectionLimit.String(): return ConnectionLimit, nil default: - return "", errors.New(errors.InvalidParameter, op, fmt.Sprintf("%s is not a valid reason", s)) + return "", errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("%s is not a valid reason", s)) } } diff --git a/internal/session/testing.go b/internal/session/testing.go index 6a71b8ee4..4b0962618 100644 --- a/internal/session/testing.go +++ b/internal/session/testing.go @@ -71,6 +71,7 @@ func TestState(t *testing.T, conn *gorm.DB, sessionId string, state Status) *Sta // are passed into New, and withServerId is handled locally. func TestSession(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, c ComposedOf, opt ...Option) *Session { t.Helper() + ctx := context.Background() opts := getOpts(opt...) require := require.New(t) if c.ExpirationTime == nil { @@ -83,25 +84,25 @@ func TestSession(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, c Compos id, err := newId() require.NoError(err) s.PublicId = id - _, certBytes, err := newCert(wrapper, c.UserId, id, c.ExpirationTime.Timestamp.AsTime()) + _, certBytes, err := newCert(ctx, wrapper, c.UserId, id, c.ExpirationTime.Timestamp.AsTime()) require.NoError(err) s.Certificate = certBytes s.ServerId = opts.withServerId if len(s.TofuToken) != 0 { - err = s.encrypt(context.Background(), wrapper) + err = s.encrypt(ctx, wrapper) } require.NoError(err) - err = rw.Create(context.Background(), s, opts.withDbOpts...) + err = rw.Create(ctx, s, opts.withDbOpts...) require.NoError(err) for _, cred := range s.DynamicCredentials { cred.SessionId = s.PublicId - err := rw.Create(context.Background(), cred) + err := rw.Create(ctx, cred) require.NoError(err) } - ss, err := fetchStates(context.Background(), rw, s.PublicId, append(opts.withDbOpts, db.WithOrder("start_time desc"))...) + ss, err := fetchStates(ctx, rw, s.PublicId, append(opts.withDbOpts, db.WithOrder("start_time desc"))...) require.NoError(err) s.States = ss @@ -204,5 +205,5 @@ func TestWorker(t *testing.T, conn *gorm.DB, wrapper wrapping.Wrapper, opt ...Op // as a parameter. It's currently used in controller.jobTestingHandler() and // should be deprecated once that function is refactored to use sessions properly. func TestCert(wrapper wrapping.Wrapper, userId, jobId string) (ed25519.PrivateKey, []byte, error) { - return newCert(wrapper, userId, jobId, time.Now().Add(5*time.Minute)) + return newCert(context.Background(), wrapper, userId, jobId, time.Now().Add(5*time.Minute)) } diff --git a/internal/session/util.go b/internal/session/util.go index 175eeb398..bbdbe6316 100644 --- a/internal/session/util.go +++ b/internal/session/util.go @@ -22,7 +22,7 @@ func DeriveED25519Key(wrapper wrapping.Wrapper, userId, jobId string) (ed25519.P reader, err := kms.NewDerivedReader(wrapper, 32, uId, jId) if err != nil { - return nil, nil, errors.Wrap(err, op) + return nil, nil, errors.WrapDeprecated(err, op) } return ed25519.GenerateKey(reader) } diff --git a/internal/target/credential_library.go b/internal/target/credential_library.go index 98a54450c..97d83f811 100644 --- a/internal/target/credential_library.go +++ b/internal/target/credential_library.go @@ -24,10 +24,10 @@ type CredentialLibrary struct { func NewCredentialLibrary(targetId, credentialLibraryId string, _ ...Option) (*CredentialLibrary, error) { const op = "target.NewCredentialLibrary" if targetId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no target id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "no target id") } if credentialLibraryId == "" { - return nil, errors.New(errors.InvalidParameter, op, "no credential library id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "no credential library id") } t := &CredentialLibrary{ diff --git a/internal/target/ids.go b/internal/target/ids.go index 874e6255c..618572621 100644 --- a/internal/target/ids.go +++ b/internal/target/ids.go @@ -13,7 +13,7 @@ func newTcpTargetId() (string, error) { const op = "target.newTcpTargetId" id, err := db.NewPublicId(TcpTargetPrefix) if err != nil { - return "", errors.Wrap(err, op) + return "", errors.WrapDeprecated(err, op) } return id, nil } diff --git a/internal/target/repository.go b/internal/target/repository.go index 9275bc01b..77fbb1dea 100644 --- a/internal/target/repository.go +++ b/internal/target/repository.go @@ -31,13 +31,13 @@ type Repository struct { func NewRepository(r db.Reader, w db.Writer, kms *kms.Kms, opt ...Option) (*Repository, error) { const op = "target.NewRepository" if r == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil reader") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil reader") } if w == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil writer") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil writer") } if kms == nil { - return nil, errors.New(errors.InvalidParameter, op, "nil kms") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "nil kms") } opts := getOpts(opt...) if opts.withLimit == 0 { @@ -61,7 +61,7 @@ func (r *Repository) LookupTarget(ctx context.Context, publicIdOrName string, op opts := getOpts(opt...) if publicIdOrName == "" { - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "missing public id") + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } var where []string @@ -71,27 +71,27 @@ func (r *Repository) LookupTarget(ctx context.Context, publicIdOrName string, op scopeNameEmpty := opts.withScopeName == "" if !nameEmpty { if opts.withName != publicIdOrName { - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "name passed in but does not match publicId") + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "name passed in but does not match publicId") } where, whereArgs = append(where, "lower(name) = lower(?)"), append(whereArgs, opts.withName) switch { case scopeIdEmpty && scopeNameEmpty: - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "using name but both scope ID and scope name are empty") + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "using name but both scope ID and scope name are empty") case !scopeIdEmpty && !scopeNameEmpty: - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "using name but both scope ID and scope name are set") + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "using name but both scope ID and scope name are set") case !scopeIdEmpty: where, whereArgs = append(where, "scope_id = ?"), append(whereArgs, opts.withScopeId) case !scopeNameEmpty: where, whereArgs = append(where, "scope_id = (select public_id from iam_scope where lower(name) = lower(?))"), append(whereArgs, opts.withScopeName) default: - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "unknown combination of parameters") + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "unknown combination of parameters") } } else { switch { case !scopeIdEmpty: - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "passed in scope ID when using target ID for lookup") + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "passed in scope ID when using target ID for lookup") case !scopeNameEmpty: - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "passed in scope name when using target ID for lookup") + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "passed in scope name when using target ID for lookup") } } @@ -113,14 +113,14 @@ func (r *Repository) LookupTarget(ctx context.Context, publicIdOrName string, op lookupErr = read.LookupWhere(ctx, &target, strings.Join(where, " and "), whereArgs...) } if lookupErr != nil { - return errors.Wrap(lookupErr, op, errors.WithMsg(fmt.Sprintf("failed for %s", publicIdOrName))) + return errors.Wrap(ctx, lookupErr, op, errors.WithMsg(fmt.Sprintf("failed for %s", publicIdOrName))) } var err error if hostSets, err = fetchSets(ctx, read, target.PublicId); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if credSources, err = fetchCredentialSources(ctx, read, target.PublicId); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, @@ -129,11 +129,11 @@ func (r *Repository) LookupTarget(ctx context.Context, publicIdOrName string, op if errors.IsNotFoundError(err) { return nil, nil, nil, nil } - return nil, nil, nil, errors.Wrap(err, op) + return nil, nil, nil, errors.Wrap(ctx, err, op) } subtype, err := target.targetSubtype() if err != nil { - return nil, nil, nil, errors.Wrap(err, op) + return nil, nil, nil, errors.Wrap(ctx, err, op) } return subtype, hostSets, credSources, nil } @@ -143,7 +143,7 @@ func (r *Repository) ListTargets(ctx context.Context, opt ...Option) ([]Target, const op = "target.(Repository).ListTargets" opts := getOpts(opt...) if len(opts.withScopeIds) == 0 && opts.withUserId == "" { - return nil, errors.New(errors.InvalidParameter, op, "must specify either scope id or user id") + return nil, errors.New(ctx, errors.InvalidParameter, op, "must specify either scope id or user id") } // TODO (jimlambrt 8/2020) - implement WithUserId() optional filtering. var where []string @@ -158,7 +158,7 @@ func (r *Repository) ListTargets(ctx context.Context, opt ...Option) ([]Target, var foundTargets []*targetView err := r.list(ctx, &foundTargets, strings.Join(where, " and "), args, opt...) if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } targets := make([]Target, 0, len(foundTargets)) @@ -166,7 +166,7 @@ func (r *Repository) ListTargets(ctx context.Context, opt ...Option) ([]Target, for _, t := range foundTargets { subtype, err := t.targetSubtype() if err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } targets = append(targets, subtype) } @@ -186,7 +186,7 @@ func (r *Repository) list(ctx context.Context, resources interface{}, where stri } dbOpts = append(dbOpts, db.WithLimit(limit)) if err := r.reader.SearchWhere(ctx, resources, where, args, dbOpts...); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil } @@ -195,12 +195,12 @@ func (r *Repository) list(ctx context.Context, resources interface{}, where stri func (r *Repository) DeleteTarget(ctx context.Context, publicId string, _ ...Option) (int, error) { const op = "target.(Repository).DeleteTarget" if publicId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing public id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing public id") } t := allocTargetView() t.PublicId = publicId if err := r.reader.LookupByPublicId(ctx, &t); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", publicId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", publicId))) } var metadata oplog.Metadata var deleteTarget interface{} @@ -211,12 +211,12 @@ func (r *Repository) DeleteTarget(ctx context.Context, publicId string, _ ...Opt deleteTarget = &tcpT metadata = tcpT.oplog(oplog.OpType_OP_TYPE_DELETE) default: - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", publicId, t.Type)) + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", publicId, t.Type)) } oplogWrapper, err := r.kms.GetWrapper(ctx, t.ScopeId, kms.KeyPurposeOplog) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var rowsDeleted int @@ -233,17 +233,17 @@ func (r *Repository) DeleteTarget(ctx context.Context, publicId string, _ ...Opt db.WithOplog(oplogWrapper, metadata), ) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsDeleted > 1 { // return err, which will result in a rollback of the delete - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been deleted") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been deleted") } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op) + return db.NoRowsAffected, errors.Wrap(ctx, err, op) } return rowsDeleted, nil } @@ -253,14 +253,14 @@ func (r *Repository) DeleteTarget(ctx context.Context, publicId string, _ ...Opt func (r *Repository) update(ctx context.Context, target Target, version uint32, fieldMaskPaths []string, setToNullPaths []string, _ ...Option) (Target, []*TargetSet, []CredentialSource, int, error) { const op = "target.(Repository).update" if version == 0 { - return nil, nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing version") + return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing version") } if target == nil { - return nil, nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "nil target") + return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "nil target") } cloner, ok := target.(Cloneable) if !ok { - return nil, nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "target is not cloneable") + return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "target is not cloneable") } dbOpts := []db.Option{ db.WithVersion(&version), @@ -270,13 +270,13 @@ func (r *Repository) update(ctx context.Context, target Target, version uint32, t := allocTargetView() t.PublicId = target.GetPublicId() if err := r.reader.LookupByPublicId(ctx, &t); err != nil { - return nil, nil, nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("lookup failed for %s", t.PublicId))) + return nil, nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("lookup failed for %s", t.PublicId))) } scopeId = t.ScopeId } oplogWrapper, err := r.kms.GetWrapper(ctx, scopeId, kms.KeyPurposeOplog) if err != nil { - return nil, nil, nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } metadata := target.oplog(oplog.OpType_OP_TYPE_UPDATE) dbOpts = append(dbOpts, db.WithOplog(oplogWrapper, metadata)) @@ -299,25 +299,25 @@ func (r *Repository) update(ctx context.Context, target Target, version uint32, dbOpts..., ) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if rowsUpdated > 1 { // return err, which will result in a rollback of the update - return errors.New(errors.MultipleRecords, op, "more than 1 resource would have been updated") + return errors.New(ctx, errors.MultipleRecords, op, "more than 1 resource would have been updated") } if hostSets, err = fetchSets(ctx, reader, target.GetPublicId()); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } if credSources, err = fetchCredentialSources(ctx, reader, target.GetPublicId()); err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { - return nil, nil, nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } return returnedTarget.(Target), hostSets, credSources, rowsUpdated, nil } diff --git a/internal/target/repository_credential_source.go b/internal/target/repository_credential_source.go index bd207c6ec..6f4698587 100644 --- a/internal/target/repository_credential_source.go +++ b/internal/target/repository_credential_source.go @@ -18,20 +18,20 @@ import ( func (r *Repository) AddTargetCredentialSources(ctx context.Context, targetId string, targetVersion uint32, cIds []string, _ ...Option) (Target, []*TargetSet, []CredentialSource, error) { const op = "target.(Repository).AddTargetCredentialSources" if targetId == "" { - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "missing target id") + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing target id") } if targetVersion == 0 { - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "missing version") + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing version") } if len(cIds) == 0 { - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "missing credential source ids") + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing credential source ids") } addCredLibs := make([]interface{}, 0, len(cIds)) for _, id := range cIds { cl, err := NewCredentialLibrary(targetId, id) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to create in memory credential library")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory credential library")) } addCredLibs = append(addCredLibs, cl) } @@ -39,7 +39,7 @@ func (r *Repository) AddTargetCredentialSources(ctx context.Context, targetId st t := allocTargetView() t.PublicId = targetId if err := r.reader.LookupByPublicId(ctx, &t); err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", targetId))) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", targetId))) } var metadata oplog.Metadata var target interface{} @@ -52,12 +52,12 @@ func (r *Repository) AddTargetCredentialSources(ctx context.Context, targetId st metadata = tcpT.oplog(oplog.OpType_OP_TYPE_UPDATE) metadata["op-type"] = append(metadata["op-type"], oplog.OpType_OP_TYPE_CREATE.String()) default: - return nil, nil, nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", t.PublicId, t.Type)) + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", t.PublicId, t.Type)) } oplogWrapper, err := r.kms.GetWrapper(ctx, t.GetScopeId(), kms.KeyPurposeOplog) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var hostSets []*TargetSet @@ -71,44 +71,44 @@ func (r *Repository) AddTargetCredentialSources(ctx context.Context, targetId st msgs := make([]*oplog.Message, 0, 2) targetTicket, err := w.GetTicket(target) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } updatedTarget = target.(Cloneable).Clone() var targetOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, updatedTarget, []string{"Version"}, nil, db.NewOplogMsg(&targetOplogMsg), db.WithVersion(&targetVersion)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update target version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update target version")) } if rowsUpdated == 0 { - return errors.New(errors.VersionMismatch, op, "invalid target version") + return errors.New(ctx, errors.VersionMismatch, op, "invalid target version") } if rowsUpdated > 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated target and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated target and %d rows updated", rowsUpdated)) } msgs = append(msgs, &targetOplogMsg) credLibsOplogMsgs := make([]*oplog.Message, 0, len(addCredLibs)) if err := w.CreateItems(ctx, addCredLibs, db.NewOplogMsgs(&credLibsOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to create target credential sources")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to create target credential sources")) } msgs = append(msgs, credLibsOplogMsgs...) if err := w.WriteOplogEntryWith(ctx, oplogWrapper, targetTicket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } hostSets, err = fetchSets(ctx, reader, targetId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve credential sources after adding")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve credential sources after adding")) } credSources, err = fetchCredentialSources(ctx, reader, targetId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve credential sources after adding")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve credential sources after adding")) } return nil }, ) if err != nil { - return nil, nil, nil, errors.Wrap(err, op) + return nil, nil, nil, errors.Wrap(ctx, err, op) } return updatedTarget.(Target), hostSets, credSources, nil } @@ -118,20 +118,20 @@ func (r *Repository) AddTargetCredentialSources(ctx context.Context, targetId st func (r *Repository) DeleteTargetCredentialSources(ctx context.Context, targetId string, targetVersion uint32, csIds []string, _ ...Option) (int, error) { const op = "target.(Repository).DeleteTargetCredentialSources" if targetId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing target id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing target id") } if targetVersion == 0 { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing version") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing version") } if len(csIds) == 0 { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing credential source ids") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing credential source ids") } deleteCredLibs := make([]interface{}, 0, len(csIds)) for _, id := range csIds { cl, err := NewCredentialLibrary(targetId, id) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to create in memory credential library")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory credential library")) } deleteCredLibs = append(deleteCredLibs, cl) } @@ -139,7 +139,7 @@ func (r *Repository) DeleteTargetCredentialSources(ctx context.Context, targetId t := allocTargetView() t.PublicId = targetId if err := r.reader.LookupByPublicId(ctx, &t); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", targetId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", targetId))) } var metadata oplog.Metadata var target interface{} @@ -152,12 +152,12 @@ func (r *Repository) DeleteTargetCredentialSources(ctx context.Context, targetId metadata = tcpT.oplog(oplog.OpType_OP_TYPE_UPDATE) metadata["op-type"] = append(metadata["op-type"], oplog.OpType_OP_TYPE_DELETE.String()) default: - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", t.PublicId, t.Type)) + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", t.PublicId, t.Type)) } oplogWrapper, err := r.kms.GetWrapper(ctx, t.GetScopeId(), kms.KeyPurposeOplog) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var rowsDeleted int @@ -169,40 +169,40 @@ func (r *Repository) DeleteTargetCredentialSources(ctx context.Context, targetId msgs := make([]*oplog.Message, 0, 2) targetTicket, err := w.GetTicket(target) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } updatedTarget := target.(Cloneable).Clone() var targetOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, updatedTarget, []string{"Version"}, nil, db.NewOplogMsg(&targetOplogMsg), db.WithVersion(&targetVersion)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update target version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update target version")) } if rowsUpdated == 0 { - return errors.New(errors.VersionMismatch, op, "invalid target version") + return errors.New(ctx, errors.VersionMismatch, op, "invalid target version") } if rowsUpdated > 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated target and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated target and %d rows updated", rowsUpdated)) } msgs = append(msgs, &targetOplogMsg) credLibsOplogMsgs := make([]*oplog.Message, 0, len(deleteCredLibs)) rowsDeleted, err = w.DeleteItems(ctx, deleteCredLibs, db.NewOplogMsgs(&credLibsOplogMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete target credential sources")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete target credential sources")) } if rowsDeleted != len(deleteCredLibs) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("credential sources deleted %d did not match request for %d", rowsDeleted, len(deleteCredLibs))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("credential sources deleted %d did not match request for %d", rowsDeleted, len(deleteCredLibs))) } msgs = append(msgs, credLibsOplogMsgs...) if err := w.WriteOplogEntryWith(ctx, oplogWrapper, targetTicket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op) + return db.NoRowsAffected, errors.Wrap(ctx, err, op) } return rowsDeleted, nil } @@ -213,25 +213,25 @@ func (r *Repository) DeleteTargetCredentialSources(ctx context.Context, targetId func (r *Repository) SetTargetCredentialSources(ctx context.Context, targetId string, targetVersion uint32, csIds []string, _ ...Option) ([]*TargetSet, []CredentialSource, int, error) { const op = "target.(Repository).SetTargetCredentialSources" if targetId == "" { - return nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing target id") + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing target id") } if targetVersion == 0 { - return nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing version") + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing version") } changes, err := r.changes(ctx, targetId, csIds) if err != nil { - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } if len(changes) == 0 { // Nothing needs to be changed, return early hostSets, err := fetchSets(ctx, r.reader, targetId) if err != nil { - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } credSources, err := fetchCredentialSources(ctx, r.reader, targetId) if err != nil { - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } return hostSets, credSources, db.NoRowsAffected, nil } @@ -240,7 +240,7 @@ func (r *Repository) SetTargetCredentialSources(ctx context.Context, targetId st for _, c := range changes { cl, err := NewCredentialLibrary(targetId, c.LibraryId) if err != nil { - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to create in memory target credential library")) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory target credential library")) } switch c.Action { case "delete": @@ -253,7 +253,7 @@ func (r *Repository) SetTargetCredentialSources(ctx context.Context, targetId st t := allocTargetView() t.PublicId = targetId if err := r.reader.LookupByPublicId(ctx, &t); err != nil { - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", targetId))) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", targetId))) } var metadata oplog.Metadata var target interface{} @@ -265,11 +265,11 @@ func (r *Repository) SetTargetCredentialSources(ctx context.Context, targetId st target = &tcpT metadata = tcpT.oplog(oplog.OpType_OP_TYPE_UPDATE) default: - return nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", t.PublicId, t.Type)) + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", t.PublicId, t.Type)) } oplogWrapper, err := r.kms.GetWrapper(ctx, t.GetScopeId(), kms.KeyPurposeOplog) if err != nil { - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var rowsAffected int @@ -283,19 +283,19 @@ func (r *Repository) SetTargetCredentialSources(ctx context.Context, targetId st msgs := make([]*oplog.Message, 0, 2) targetTicket, err := w.GetTicket(target) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } updatedTarget := target.(Cloneable).Clone() var targetOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, updatedTarget, []string{"Version"}, nil, db.NewOplogMsg(&targetOplogMsg), db.WithVersion(&targetVersion)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update target version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update target version")) } if rowsUpdated == 0 { - return errors.New(errors.VersionMismatch, op, "invalid target version") + return errors.New(ctx, errors.VersionMismatch, op, "invalid target version") } if rowsUpdated > 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated target and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated target and %d rows updated", rowsUpdated)) } msgs = append(msgs, &targetOplogMsg) @@ -303,7 +303,7 @@ func (r *Repository) SetTargetCredentialSources(ctx context.Context, targetId st if len(addCredLibs) > 0 { addMsgs := make([]*oplog.Message, 0, len(addCredLibs)) if err := w.CreateItems(ctx, addCredLibs, db.NewOplogMsgs(&addMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add target credential libraries")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add target credential libraries")) } rowsAffected += len(addMsgs) msgs = append(msgs, addMsgs...) @@ -315,32 +315,32 @@ func (r *Repository) SetTargetCredentialSources(ctx context.Context, targetId st delMsgs := make([]*oplog.Message, 0, len(deleteCredLibs)) rowsDeleted, err := w.DeleteItems(ctx, deleteCredLibs, db.NewOplogMsgs(&delMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete target credential libraries")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete target credential libraries")) } if rowsDeleted != len(delMsgs) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("target credential libraries deleted %d did not match request for %d", rowsDeleted, len(deleteCredLibs))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("target credential libraries deleted %d did not match request for %d", rowsDeleted, len(deleteCredLibs))) } rowsAffected += rowsDeleted msgs = append(msgs, delMsgs...) metadata["op-type"] = append(metadata["op-type"], oplog.OpType_OP_TYPE_DELETE.String()) } if err := w.WriteOplogEntryWith(ctx, oplogWrapper, targetTicket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } hostSets, err = fetchSets(ctx, reader, targetId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current target host sets after add/delete")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current target host sets after add/delete")) } credSources, err = fetchCredentialSources(ctx, reader, targetId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current target credential sources after add/delete")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current target credential sources after add/delete")) } return nil }, ) if err != nil { - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } return hostSets, credSources, rowsAffected, nil } @@ -370,7 +370,7 @@ func (r *Repository) changes(ctx context.Context, targetId string, clIds []strin } rows, err := r.reader.Query(ctx, query, params) if err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("query failed")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("query failed")) } defer rows.Close() @@ -378,7 +378,7 @@ func (r *Repository) changes(ctx context.Context, targetId string, clIds []strin for rows.Next() { var chg change if err := r.reader.ScanRows(rows, &chg); err != nil { - return nil, errors.Wrap(err, op, errors.WithMsg("scan row failed")) + return nil, errors.Wrap(ctx, err, op, errors.WithMsg("scan row failed")) } changes = append(changes, &chg) } @@ -389,7 +389,7 @@ func fetchCredentialSources(ctx context.Context, r db.Reader, targetId string) ( const op = "target.fetchCredentialSources" var libraries []*TargetLibrary if err := r.SearchWhere(ctx, &libraries, "target_id = ?", []interface{}{targetId}); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } // FIXME: When we have static creds, there will need to be an updated view // that unions between libs and creds, at which point the type above will diff --git a/internal/target/repository_host_set.go b/internal/target/repository_host_set.go index 818c0ca76..1ee77c58f 100644 --- a/internal/target/repository_host_set.go +++ b/internal/target/repository_host_set.go @@ -18,26 +18,26 @@ import ( func (r *Repository) AddTargetHostSets(ctx context.Context, targetId string, targetVersion uint32, hostSetIds []string, _ ...Option) (Target, []*TargetSet, []CredentialSource, error) { const op = "target.(Repository).AddTargetHostSets" if targetId == "" { - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "missing target id") + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing target id") } if targetVersion == 0 { - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "missing version") + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing version") } if len(hostSetIds) == 0 { - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "missing host set ids") + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing host set ids") } newHostSets := make([]interface{}, 0, len(hostSetIds)) for _, id := range hostSetIds { ths, err := NewTargetHostSet(targetId, id) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to create in memory target host set")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory target host set")) } newHostSets = append(newHostSets, ths) } t := allocTargetView() t.PublicId = targetId if err := r.reader.LookupByPublicId(ctx, &t); err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", targetId))) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", targetId))) } var metadata oplog.Metadata var target interface{} @@ -50,11 +50,11 @@ func (r *Repository) AddTargetHostSets(ctx context.Context, targetId string, tar metadata = tcpT.oplog(oplog.OpType_OP_TYPE_UPDATE) metadata["op-type"] = append(metadata["op-type"], oplog.OpType_OP_TYPE_CREATE.String()) default: - return nil, nil, nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", t.PublicId, t.Type)) + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", t.PublicId, t.Type)) } oplogWrapper, err := r.kms.GetWrapper(ctx, t.GetScopeId(), kms.KeyPurposeOplog) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var currentHostSets []*TargetSet var currentCredSources []CredentialSource @@ -67,41 +67,41 @@ func (r *Repository) AddTargetHostSets(ctx context.Context, targetId string, tar msgs := make([]*oplog.Message, 0, 2) targetTicket, err := w.GetTicket(target) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } updatedTarget = target.(Cloneable).Clone() var targetOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, updatedTarget, []string{"Version"}, nil, db.NewOplogMsg(&targetOplogMsg), db.WithVersion(&targetVersion)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update target version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update target version")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated target and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated target and %d rows updated", rowsUpdated)) } msgs = append(msgs, &targetOplogMsg) hostSetsOplogMsgs := make([]*oplog.Message, 0, len(newHostSets)) if err := w.CreateItems(ctx, newHostSets, db.NewOplogMsgs(&hostSetsOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add target host sets")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add target host sets")) } msgs = append(msgs, hostSetsOplogMsgs...) if err := w.WriteOplogEntryWith(ctx, oplogWrapper, targetTicket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } currentHostSets, err = fetchSets(ctx, reader, targetId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current host sets after adds")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current host sets after adds")) } currentCredSources, err = fetchCredentialSources(ctx, reader, targetId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current credential sources after adds")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current credential sources after adds")) } return nil }, ) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("error creating sets")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("error creating sets")) } return updatedTarget.(Target), currentHostSets, currentCredSources, nil } @@ -113,19 +113,19 @@ func (r *Repository) AddTargetHostSets(ctx context.Context, targetId string, tar func (r *Repository) DeleteTargeHostSets(ctx context.Context, targetId string, targetVersion uint32, hostSetIds []string, _ ...Option) (int, error) { const op = "target.(Repository).DeleteTargeHostSets" if targetId == "" { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing target id") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing target id") } if targetVersion == 0 { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing version") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing version") } if len(hostSetIds) == 0 { - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing host set ids") + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing host set ids") } deleteTargeHostSets := make([]interface{}, 0, len(hostSetIds)) for _, id := range hostSetIds { ths, err := NewTargetHostSet(targetId, id) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to create in memory target host set")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory target host set")) } deleteTargeHostSets = append(deleteTargeHostSets, ths) } @@ -133,7 +133,7 @@ func (r *Repository) DeleteTargeHostSets(ctx context.Context, targetId string, t t := allocTargetView() t.PublicId = targetId if err := r.reader.LookupByPublicId(ctx, &t); err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", targetId))) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", targetId))) } var metadata oplog.Metadata @@ -147,11 +147,11 @@ func (r *Repository) DeleteTargeHostSets(ctx context.Context, targetId string, t metadata = tcpT.oplog(oplog.OpType_OP_TYPE_UPDATE) metadata["op-type"] = append(metadata["op-type"], oplog.OpType_OP_TYPE_DELETE.String()) default: - return db.NoRowsAffected, errors.New(errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", t.PublicId, t.Type)) + return db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", t.PublicId, t.Type)) } oplogWrapper, err := r.kms.GetWrapper(ctx, t.GetScopeId(), kms.KeyPurposeOplog) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var totalRowsDeleted int @@ -163,38 +163,38 @@ func (r *Repository) DeleteTargeHostSets(ctx context.Context, targetId string, t msgs := make([]*oplog.Message, 0, 2) targetTicket, err := w.GetTicket(target) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } updatedTarget := target.(Cloneable).Clone() var targetOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, updatedTarget, []string{"Version"}, nil, db.NewOplogMsg(&targetOplogMsg), db.WithVersion(&targetVersion)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update target version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update target version")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("updated target and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("updated target and %d rows updated", rowsUpdated)) } msgs = append(msgs, &targetOplogMsg) hostSetsOplogMsgs := make([]*oplog.Message, 0, len(deleteTargeHostSets)) rowsDeleted, err := w.DeleteItems(ctx, deleteTargeHostSets, db.NewOplogMsgs(&hostSetsOplogMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete target host sets")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete target host sets")) } if rowsDeleted != len(deleteTargeHostSets) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("target host sets deleted %d did not match request for %d", rowsDeleted, len(deleteTargeHostSets))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("target host sets deleted %d did not match request for %d", rowsDeleted, len(deleteTargeHostSets))) } totalRowsDeleted += rowsDeleted msgs = append(msgs, hostSetsOplogMsgs...) if err := w.WriteOplogEntryWith(ctx, oplogWrapper, targetTicket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } return nil }, ) if err != nil { - return db.NoRowsAffected, errors.Wrap(err, op) + return db.NoRowsAffected, errors.Wrap(ctx, err, op) } return totalRowsDeleted, nil } @@ -206,15 +206,15 @@ func (r *Repository) DeleteTargeHostSets(ctx context.Context, targetId string, t func (r *Repository) SetTargetHostSets(ctx context.Context, targetId string, targetVersion uint32, hostSetIds []string, _ ...Option) ([]*TargetSet, []CredentialSource, int, error) { const op = "target.(Repository).SetTargetHostSets" if targetId == "" { - return nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing target id") + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing target id") } if targetVersion == 0 { - return nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing version") + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing version") } t := allocTargetView() t.PublicId = targetId if err := r.reader.LookupByPublicId(ctx, &t); err != nil { - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", targetId))) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", targetId))) } // NOTE: calculating that to set can safely happen outside of the write @@ -225,7 +225,7 @@ func (r *Repository) SetTargetHostSets(ctx context.Context, targetId string, tar // TODO(mgaffney) 08/2020: Use SQL to calculate changes. foundThs, err := fetchSets(ctx, r.reader, targetId) if err != nil { - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to search for existing target host sets")) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to search for existing target host sets")) } found := map[string]*TargetSet{} for _, s := range foundThs { @@ -241,7 +241,7 @@ func (r *Repository) SetTargetHostSets(ctx context.Context, targetId string, tar } hs, err := NewTargetHostSet(targetId, id) if err != nil { - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to create in memory target host set")) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory target host set")) } addHostSets = append(addHostSets, hs) } @@ -250,7 +250,7 @@ func (r *Repository) SetTargetHostSets(ctx context.Context, targetId string, tar for _, s := range found { hs, err := NewTargetHostSet(targetId, s.PublicId) if err != nil { - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(" unable to create in memory target host set")) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(" unable to create in memory target host set")) } deleteHostSets = append(deleteHostSets, hs) } @@ -269,11 +269,11 @@ func (r *Repository) SetTargetHostSets(ctx context.Context, targetId string, tar target = &tcpT metadata = tcpT.oplog(oplog.OpType_OP_TYPE_UPDATE) default: - return nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", t.PublicId, t.Type)) + return nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("%s is an unsupported target type %s", t.PublicId, t.Type)) } oplogWrapper, err := r.kms.GetWrapper(ctx, t.GetScopeId(), kms.KeyPurposeOplog) if err != nil { - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } var totalRowsAffected int @@ -287,16 +287,16 @@ func (r *Repository) SetTargetHostSets(ctx context.Context, targetId string, tar msgs := make([]*oplog.Message, 0, 2) targetTicket, err := w.GetTicket(target) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } updatedTarget := target.(Cloneable).Clone() var targetOplogMsg oplog.Message rowsUpdated, err := w.Update(ctx, updatedTarget, []string{"Version"}, nil, db.NewOplogMsg(&targetOplogMsg), db.WithVersion(&targetVersion)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to update target version")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to update target version")) } if rowsUpdated != 1 { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("set target host sets: updated target and %d rows updated", rowsUpdated)) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("set target host sets: updated target and %d rows updated", rowsUpdated)) } msgs = append(msgs, &targetOplogMsg) @@ -304,7 +304,7 @@ func (r *Repository) SetTargetHostSets(ctx context.Context, targetId string, tar if len(addHostSets) > 0 { hostSetOplogMsgs := make([]*oplog.Message, 0, len(addHostSets)) if err := w.CreateItems(ctx, addHostSets, db.NewOplogMsgs(&hostSetOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add target host sets")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add target host sets")) } totalRowsAffected += len(addHostSets) msgs = append(msgs, hostSetOplogMsgs...) @@ -316,33 +316,33 @@ func (r *Repository) SetTargetHostSets(ctx context.Context, targetId string, tar hostSetOplogMsgs := make([]*oplog.Message, 0, len(deleteHostSets)) rowsDeleted, err := w.DeleteItems(ctx, deleteHostSets, db.NewOplogMsgs(&hostSetOplogMsgs)) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to delete target host set")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to delete target host set")) } if rowsDeleted != len(deleteHostSets) { - return errors.New(errors.MultipleRecords, op, fmt.Sprintf("target host sets deleted %d did not match request for %d", rowsDeleted, len(deleteHostSets))) + return errors.New(ctx, errors.MultipleRecords, op, fmt.Sprintf("target host sets deleted %d did not match request for %d", rowsDeleted, len(deleteHostSets))) } totalRowsAffected += rowsDeleted msgs = append(msgs, hostSetOplogMsgs...) metadata["op-type"] = append(metadata["op-type"], oplog.OpType_OP_TYPE_DELETE.String()) } if err := w.WriteOplogEntryWith(ctx, oplogWrapper, targetTicket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } currentHostSets, err = fetchSets(ctx, reader, targetId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current target host sets after set")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current target host sets after set")) } currentCredSources, err = fetchCredentialSources(ctx, reader, targetId) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to retrieve current target credential sources after set")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to retrieve current target credential sources after set")) } return nil }, ) if err != nil { - return nil, nil, db.NoRowsAffected, errors.Wrap(err, op) + return nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op) } return currentHostSets, currentCredSources, totalRowsAffected, nil } @@ -351,7 +351,7 @@ func fetchSets(ctx context.Context, r db.Reader, targetId string) ([]*TargetSet, const op = "target.fetchSets" var hostSets []*TargetSet if err := r.SearchWhere(ctx, &hostSets, "target_id = ?", []interface{}{targetId}); err != nil { - return nil, errors.Wrap(err, op) + return nil, errors.Wrap(ctx, err, op) } if len(hostSets) == 0 { return nil, nil diff --git a/internal/target/repository_tcp_target.go b/internal/target/repository_tcp_target.go index 4a4b0dcae..49dfad42d 100644 --- a/internal/target/repository_tcp_target.go +++ b/internal/target/repository_tcp_target.go @@ -19,46 +19,46 @@ func (r *Repository) CreateTcpTarget(ctx context.Context, target *TcpTarget, opt const op = "target.(Repository).CreateTcpTarget" opts := getOpts(opt...) if target == nil { - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "missing target") + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing target") } if target.TcpTarget == nil { - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "missing target store") + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing target store") } if target.ScopeId == "" { - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } if target.Name == "" { - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "missing name") + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "missing name") } if target.PublicId != "" { - return nil, nil, nil, errors.New(errors.InvalidParameter, op, "public id not empty") + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, "public id not empty") } t := target.Clone().(*TcpTarget) if opts.withPublicId != "" { if !strings.HasPrefix(opts.withPublicId, TcpTargetPrefix+"_") { - return nil, nil, nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("passed-in public ID %q has wrong prefix, should be %q", opts.withPublicId, TcpTargetPrefix)) + return nil, nil, nil, errors.New(ctx, errors.InvalidParameter, op, fmt.Sprintf("passed-in public ID %q has wrong prefix, should be %q", opts.withPublicId, TcpTargetPrefix)) } t.PublicId = opts.withPublicId } else { id, err := newTcpTargetId() if err != nil { - return nil, nil, nil, errors.Wrap(err, op) + return nil, nil, nil, errors.Wrap(ctx, err, op) } t.PublicId = id } oplogWrapper, err := r.kms.GetWrapper(ctx, target.ScopeId, kms.KeyPurposeOplog) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to get oplog wrapper")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to get oplog wrapper")) } newHostSets := make([]interface{}, 0, len(opts.withHostSets)) for _, hsId := range opts.withHostSets { hostSet, err := NewTargetHostSet(t.PublicId, hsId) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to create in memory target host set")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory target host set")) } newHostSets = append(newHostSets, hostSet) } @@ -67,7 +67,7 @@ func (r *Repository) CreateTcpTarget(ctx context.Context, target *TcpTarget, opt for _, clId := range opts.withCredentialSources { credLib, err := NewCredentialLibrary(t.PublicId, clId) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg("unable to create in memory target credential library")) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg("unable to create in memory target credential library")) } newCredLibs = append(newCredLibs, credLib) } @@ -83,44 +83,44 @@ func (r *Repository) CreateTcpTarget(ctx context.Context, target *TcpTarget, opt func(read db.Reader, w db.Writer) error { targetTicket, err := w.GetTicket(t) if err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to get ticket")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to get ticket")) } msgs := make([]*oplog.Message, 0, 2) var targetOplogMsg oplog.Message returnedTarget = t.Clone() if err := w.Create(ctx, returnedTarget, db.NewOplogMsg(&targetOplogMsg)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to create target")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to create target")) } msgs = append(msgs, &targetOplogMsg) if len(newHostSets) > 0 { hostSetOplogMsgs := make([]*oplog.Message, 0, len(newHostSets)) if err := w.CreateItems(ctx, newHostSets, db.NewOplogMsgs(&hostSetOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add host sets")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add host sets")) } if returnedHostSet, err = fetchSets(ctx, read, t.PublicId); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to read host sets")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to read host sets")) } msgs = append(msgs, hostSetOplogMsgs...) } if len(newCredLibs) > 0 { credLibOplogMsgs := make([]*oplog.Message, 0, len(newCredLibs)) if err := w.CreateItems(ctx, newCredLibs, db.NewOplogMsgs(&credLibOplogMsgs)); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to add credential sources")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to add credential sources")) } if returnedCredSources, err = fetchCredentialSources(ctx, read, t.PublicId); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to read credential sources")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to read credential sources")) } msgs = append(msgs, credLibOplogMsgs...) } if err := w.WriteOplogEntryWith(ctx, oplogWrapper, targetTicket, metadata, msgs); err != nil { - return errors.Wrap(err, op, errors.WithMsg("unable to write oplog")) + return errors.Wrap(ctx, err, op, errors.WithMsg("unable to write oplog")) } return nil }, ) if err != nil { - return nil, nil, nil, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s target id", t.PublicId))) + return nil, nil, nil, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s target id", t.PublicId))) } return returnedTarget.(*TcpTarget), returnedHostSet, returnedCredSources, nil } @@ -134,13 +134,13 @@ func (r *Repository) CreateTcpTarget(ctx context.Context, target *TcpTarget, opt func (r *Repository) UpdateTcpTarget(ctx context.Context, target *TcpTarget, version uint32, fieldMaskPaths []string, _ ...Option) (Target, []*TargetSet, []CredentialSource, int, error) { const op = "target.(Repository).UpdateTcpTarget" if target == nil { - return nil, nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing target") + return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing target") } if target.TcpTarget == nil { - return nil, nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing target store") + return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing target store") } if target.PublicId == "" { - return nil, nil, nil, db.NoRowsAffected, errors.New(errors.InvalidParameter, op, "missing target public id") + return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidParameter, op, "missing target public id") } for _, f := range fieldMaskPaths { switch { @@ -151,7 +151,7 @@ func (r *Repository) UpdateTcpTarget(ctx context.Context, target *TcpTarget, ver case strings.EqualFold("sessionconnectionlimit", f): case strings.EqualFold("workerfilter", f): default: - return nil, nil, nil, db.NoRowsAffected, errors.New(errors.InvalidFieldMask, op, fmt.Sprintf("invalid field mask: %s", f)) + return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.InvalidFieldMask, op, fmt.Sprintf("invalid field mask: %s", f)) } } var dbMask, nullFields []string @@ -168,7 +168,7 @@ func (r *Repository) UpdateTcpTarget(ctx context.Context, target *TcpTarget, ver []string{"SessionMaxSeconds", "SessionConnectionLimit"}, ) if len(dbMask) == 0 && len(nullFields) == 0 { - return nil, nil, nil, db.NoRowsAffected, errors.New(errors.EmptyFieldMask, op, "empty field mask") + return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.EmptyFieldMask, op, "empty field mask") } var returnedTarget Target var rowsUpdated int @@ -183,16 +183,16 @@ func (r *Repository) UpdateTcpTarget(ctx context.Context, target *TcpTarget, ver t := target.Clone().(*TcpTarget) returnedTarget, targetSets, credSources, rowsUpdated, err = r.update(ctx, t, version, dbMask, nullFields) if err != nil { - return errors.Wrap(err, op) + return errors.Wrap(ctx, err, op) } return nil }, ) if err != nil { if errors.IsUniqueError(err) { - return nil, nil, nil, db.NoRowsAffected, errors.New(errors.NotUnique, op, fmt.Sprintf("target %s already exists in scope %s", target.Name, target.ScopeId)) + return nil, nil, nil, db.NoRowsAffected, errors.New(ctx, errors.NotUnique, op, fmt.Sprintf("target %s already exists in scope %s", target.Name, target.ScopeId)) } - return nil, nil, nil, db.NoRowsAffected, errors.Wrap(err, op, errors.WithMsg(fmt.Sprintf("failed for %s", target.PublicId))) + return nil, nil, nil, db.NoRowsAffected, errors.Wrap(ctx, err, op, errors.WithMsg(fmt.Sprintf("failed for %s", target.PublicId))) } return returnedTarget, targetSets, credSources, rowsUpdated, nil } diff --git a/internal/target/target.go b/internal/target/target.go index 9623bf1cf..7b27117d9 100644 --- a/internal/target/target.go +++ b/internal/target/target.go @@ -98,5 +98,5 @@ func (t *targetView) targetSubtype() (Target, error) { tcpTarget.WorkerFilter = t.WorkerFilter return &tcpTarget, nil } - return nil, errors.New(errors.InvalidParameter, op, fmt.Sprintf("%s is an unknown target subtype of %s", t.PublicId, t.Type)) + return nil, errors.NewDeprecated(errors.InvalidParameter, op, fmt.Sprintf("%s is an unknown target subtype of %s", t.PublicId, t.Type)) } diff --git a/internal/target/target_host_set.go b/internal/target/target_host_set.go index 7373fc6a8..e063203f6 100644 --- a/internal/target/target_host_set.go +++ b/internal/target/target_host_set.go @@ -28,10 +28,10 @@ var _ db.VetForWriter = (*TargetHostSet)(nil) func NewTargetHostSet(targetId, hostSetId string, _ ...Option) (*TargetHostSet, error) { const op = "target.NewTargetHostSet" if targetId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing target id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing target id") } if hostSetId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing hostSetId id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing hostSetId id") } t := &TargetHostSet{ TargetHostSet: &store.TargetHostSet{ @@ -59,14 +59,14 @@ func (t *TargetHostSet) Clone() interface{} { // VetForWrite implements db.VetForWrite() interface and validates the target // host set before it's written. -func (t *TargetHostSet) VetForWrite(_ context.Context, _ db.Reader, opType db.OpType, _ ...db.Option) error { +func (t *TargetHostSet) VetForWrite(ctx context.Context, _ db.Reader, opType db.OpType, _ ...db.Option) error { const op = "target.(TargetHostSet).VetForWrite" if opType == db.CreateOp { if t.TargetId == "" { - return errors.New(errors.InvalidParameter, op, "missing target id") + return errors.New(ctx, errors.InvalidParameter, op, "missing target id") } if t.HostSetId == "" { - return errors.New(errors.InvalidParameter, op, "missing host set id") + return errors.New(ctx, errors.InvalidParameter, op, "missing host set id") } } return nil diff --git a/internal/target/tcp_target.go b/internal/target/tcp_target.go index dc3a421a6..b43d94aa3 100644 --- a/internal/target/tcp_target.go +++ b/internal/target/tcp_target.go @@ -31,7 +31,7 @@ func NewTcpTarget(scopeId string, opt ...Option) (*TcpTarget, error) { const op = "target.NewTcpTarget" opts := getOpts(opt...) if scopeId == "" { - return nil, errors.New(errors.InvalidParameter, op, "missing scope id") + return nil, errors.NewDeprecated(errors.InvalidParameter, op, "missing scope id") } t := &TcpTarget{ TcpTarget: &store.TcpTarget{ @@ -64,17 +64,17 @@ func (t *TcpTarget) Clone() interface{} { // VetForWrite implements db.VetForWrite() interface and validates the tcp target // before it's written. -func (t *TcpTarget) VetForWrite(_ context.Context, _ db.Reader, opType db.OpType, _ ...db.Option) error { +func (t *TcpTarget) VetForWrite(ctx context.Context, _ db.Reader, opType db.OpType, _ ...db.Option) error { const op = "target.(TcpTarget).VetForWrite" if t.PublicId == "" { - return errors.New(errors.InvalidParameter, op, "missing public id") + return errors.New(ctx, errors.InvalidParameter, op, "missing public id") } if opType == db.CreateOp { if t.ScopeId == "" { - return errors.New(errors.InvalidParameter, op, "missing scope id") + return errors.New(ctx, errors.InvalidParameter, op, "missing scope id") } if t.Name == "" { - return errors.New(errors.InvalidParameter, op, "missing name") + return errors.New(ctx, errors.InvalidParameter, op, "missing name") } } return nil diff --git a/internal/types/subtypes/registry.go b/internal/types/subtypes/registry.go index 51804bbce..27423ad7a 100644 --- a/internal/types/subtypes/registry.go +++ b/internal/types/subtypes/registry.go @@ -25,7 +25,7 @@ func (t Subtype) String() string { // Registry is not thread safe. type Registry struct { subtypesPrefixes map[string]Subtype - knownSubtypes map[Subtype]interface{} + knownSubtypes map[Subtype]interface{} } // New Registry creates a new boundary resource subtype registry. @@ -68,14 +68,14 @@ func (r *Registry) SubtypeFromId(id string) Subtype { func (r *Registry) Register(subtype Subtype, prefixes ...string) error { const op = "subtypes.(Registry).Register" if _, present := r.knownSubtypes[subtype]; present { - return errors.New(errors.SubtypeAlreadyRegistered, op, fmt.Sprintf("subtype %q already registered", subtype)) + return errors.NewDeprecated(errors.SubtypeAlreadyRegistered, op, fmt.Sprintf("subtype %q already registered", subtype)) } r.knownSubtypes[subtype] = nil for _, prefix := range prefixes { prefix = strings.TrimSpace(prefix) if st, ok := r.subtypesPrefixes[prefix]; ok { - return errors.New(errors.SubtypeAlreadyRegistered, op, fmt.Sprintf("prefix %q is already registered to subtype %q", prefix, st)) + return errors.NewDeprecated(errors.SubtypeAlreadyRegistered, op, fmt.Sprintf("prefix %q is already registered to subtype %q", prefix, st)) } r.subtypesPrefixes[prefix] = subtype }