encryption: Simplify EncryptJSON (#44764)

Instead of needing to pass a value in, we can supply the type we want
and return a new value of that type.
This commit is contained in:
Ryan Slade 2022-11-23 15:23:34 +01:00 committed by GitHub
parent 3e92c8ab8f
commit cb5774db8d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 19 additions and 29 deletions

View File

@ -139,8 +139,8 @@ func (p *Provider) FetchUserPerms(ctx context.Context, account *extsvc.Account,
p.codeHost.ServiceID, account.AccountSpec.ServiceID)
}
var user bitbucketserver.User
if err := encryption.DecryptJSON(ctx, account.Data, &user); err != nil {
user, err := encryption.DecryptJSON[bitbucketserver.User](ctx, account.Data)
if err != nil {
return nil, errors.Wrap(err, "unmarshaling account data")
}

View File

@ -60,18 +60,20 @@ func (e *JSONEncryptable[T]) Set(value T) error {
return nil
}
// DecryptJSON decrypts the encryptable value and updates the given value. This method may make an external
// DecryptJSON decrypts the encryptable value. This method may make an external
// API call to decrypt the underlying encrypted value, but will memoize the result so that subsequent calls
// will be cheap.
func DecryptJSON[T any](ctx context.Context, e *JSONEncryptable[any], value T) error {
func DecryptJSON[T any](ctx context.Context, e *JSONEncryptable[any]) (*T, error) {
var value T
serialized, err := e.Encryptable.Decrypt(ctx)
if err != nil {
return err
return nil, err
}
if err := json.Unmarshal([]byte(serialized), &value); err != nil {
return err
return nil, err
}
return nil
return &value, nil
}

View File

@ -20,7 +20,5 @@ func GetExternalAccountData(ctx context.Context, data *extsvc.AccountData) (*Acc
return nil, nil
}
var d AccountData
err := encryption.DecryptJSON(ctx, data.Data, &d)
return &d, err
return encryption.DecryptJSON[AccountData](ctx, data.Data)
}

View File

@ -1893,21 +1893,17 @@ type restTopicsResponse struct {
func GetExternalAccountData(ctx context.Context, data *extsvc.AccountData) (usr *github.User, tok *oauth2.Token, err error) {
if data.Data != nil {
var u github.User
if err := encryption.DecryptJSON(ctx, data.Data, &u); err != nil {
usr, err = encryption.DecryptJSON[github.User](ctx, data.Data)
if err != nil {
return nil, nil, err
}
usr = &u
}
if data.AuthData != nil {
var t oauth2.Token
if err := encryption.DecryptJSON(ctx, data.AuthData, &t); err != nil {
tok, err = encryption.DecryptJSON[oauth2.Token](ctx, data.AuthData)
if err != nil {
return nil, nil, err
}
tok = &t
}
return usr, tok, nil

View File

@ -14,21 +14,17 @@ import (
// JSON blob in a typesafe way.
func GetExternalAccountData(ctx context.Context, data *extsvc.AccountData) (usr *User, tok *oauth2.Token, err error) {
if data.Data != nil {
var u User
if err := encryption.DecryptJSON(ctx, data.Data, &u); err != nil {
usr, err = encryption.DecryptJSON[User](ctx, data.Data)
if err != nil {
return nil, nil, err
}
usr = &u
}
if data.AuthData != nil {
var t oauth2.Token
if err := encryption.DecryptJSON(ctx, data.AuthData, &t); err != nil {
tok, err = encryption.DecryptJSON[oauth2.Token](ctx, data.AuthData)
if err != nil {
return nil, nil, err
}
tok = &t
}
return usr, tok, nil

View File

@ -19,7 +19,5 @@ func GetExternalAccountData(ctx context.Context, data *extsvc.AccountData) (*Acc
return nil, nil
}
var d AccountData
err := encryption.DecryptJSON(ctx, data.Data, &d)
return &d, err
return encryption.DecryptJSON[AccountData](ctx, data.Data)
}