@ -13,12 +13,18 @@ import (
"github.com/grafana/grafana/pkg/setting"
)
type SecretsRotator interface {
ReEncrypt ( context . Context , * manager . SecretsService , db . DB ) bool
Rollback ( context . Context , * manager . SecretsService , encryption . Internal , db . DB , string ) bool
}
type SecretsMigrator struct {
encryptionSrv encryption . Internal
secretsSrv * manager . SecretsService
sqlStore db . DB
settings setting . Provider
features featuremgmt . FeatureToggles
rotators [ ] SecretsRotator
}
func ProvideSecretsMigrator (
@ -28,38 +34,41 @@ func ProvideSecretsMigrator(
settings setting . Provider ,
features featuremgmt . FeatureToggles ,
) * SecretsMigrator {
rotators := [ ] SecretsRotator {
simpleSecret { tableName : "dashboard_snapshot" , columnName : "dashboard_encrypted" } ,
b64Secret { simpleSecret : simpleSecret { tableName : "user_auth" , columnName : "o_auth_access_token" } , encoding : base64 . StdEncoding } ,
b64Secret { simpleSecret : simpleSecret { tableName : "user_auth" , columnName : "o_auth_refresh_token" } , encoding : base64 . StdEncoding } ,
b64Secret { simpleSecret : simpleSecret { tableName : "user_auth" , columnName : "o_auth_token_type" } , encoding : base64 . StdEncoding } ,
b64Secret { simpleSecret : simpleSecret { tableName : "secrets" , columnName : "value" } , hasUpdatedColumn : true , encoding : base64 . RawStdEncoding } ,
jsonSecret { tableName : "data_source" } ,
jsonSecret { tableName : "plugin_setting" } ,
alertingSecret { } ,
}
return & SecretsMigrator {
encryptionSrv : encryptionSrv ,
secretsSrv : service ,
sqlStore : sqlStore ,
settings : settings ,
features : features ,
rotators : rotators ,
}
}
func ( m * SecretsMigrator ) RegisterRotators ( rotators ... SecretsRotator ) {
m . rotators = append ( m . rotators , rotators ... )
}
func ( m * SecretsMigrator ) ReEncryptSecrets ( ctx context . Context ) ( bool , error ) {
err := m . initProvidersIfNeeded ( )
if err != nil {
return false , err
}
toReencrypt := [ ] interface {
reencrypt ( context . Context , * manager . SecretsService , db . DB ) bool
} {
simpleSecret { tableName : "dashboard_snapshot" , columnName : "dashboard_encrypted" } ,
b64Secret { simpleSecret : simpleSecret { tableName : "user_auth" , columnName : "o_auth_access_token" } , encoding : base64 . StdEncoding } ,
b64Secret { simpleSecret : simpleSecret { tableName : "user_auth" , columnName : "o_auth_refresh_token" } , encoding : base64 . StdEncoding } ,
b64Secret { simpleSecret : simpleSecret { tableName : "user_auth" , columnName : "o_auth_token_type" } , encoding : base64 . StdEncoding } ,
b64Secret { simpleSecret : simpleSecret { tableName : "secrets" , columnName : "value" } , hasUpdatedColumn : true , encoding : base64 . RawStdEncoding } ,
jsonSecret { tableName : "data_source" } ,
jsonSecret { tableName : "plugin_setting" } ,
alertingSecret { } ,
}
var anyFailure bool
for _ , r := range toReencrypt {
if success := r . ree ncrypt( ctx , m . secretsSrv , m . sqlStore ) ; ! success {
for _ , r := range m . rotators {
if success := r . ReEncrypt ( ctx , m . secretsSrv , m . sqlStore ) ; ! success {
anyFailure = true
}
}
@ -73,23 +82,10 @@ func (m *SecretsMigrator) RollBackSecrets(ctx context.Context) (bool, error) {
return false , err
}
toRollback := [ ] interface {
rollback ( context . Context , * manager . SecretsService , encryption . Internal , db . DB , string ) bool
} {
simpleSecret { tableName : "dashboard_snapshot" , columnName : "dashboard_encrypted" } ,
b64Secret { simpleSecret : simpleSecret { tableName : "user_auth" , columnName : "o_auth_access_token" } , encoding : base64 . StdEncoding } ,
b64Secret { simpleSecret : simpleSecret { tableName : "user_auth" , columnName : "o_auth_refresh_token" } , encoding : base64 . StdEncoding } ,
b64Secret { simpleSecret : simpleSecret { tableName : "user_auth" , columnName : "o_auth_token_type" } , encoding : base64 . StdEncoding } ,
b64Secret { simpleSecret : simpleSecret { tableName : "secrets" , columnName : "value" } , hasUpdatedColumn : true , encoding : base64 . RawStdEncoding } ,
jsonSecret { tableName : "data_source" } ,
jsonSecret { tableName : "plugin_setting" } ,
alertingSecret { } ,
}
var anyFailure bool
for _ , r := range toRollback {
if failed := r . r ollback( ctx ,
for _ , r := range m . rotators {
if failed := r . Rollback ( ctx ,
m . secretsSrv ,
m . encryptionSrv ,
m . sqlStore ,
@ -133,12 +129,26 @@ type simpleSecret struct {
columnName string
}
func NewSimpleSecret ( tableName , columnName string ) simpleSecret {
return simpleSecret {
tableName : tableName ,
columnName : columnName ,
}
}
type b64Secret struct {
simpleSecret
hasUpdatedColumn bool
encoding * base64 . Encoding
}
func NewBase64Secret ( simple simpleSecret , encoding * base64 . Encoding ) b64Secret {
return b64Secret {
simpleSecret : simple ,
encoding : encoding ,
}
}
type jsonSecret struct {
tableName string
}