diff --git a/pkg/config/redacted.go b/pkg/config/redacted.go new file mode 100644 index 000000000..3117a330b --- /dev/null +++ b/pkg/config/redacted.go @@ -0,0 +1,43 @@ +package config + +import ( + "fmt" +) + +const redactedSecretStr = "*** REDACTED ***" + +// HideSensitiveInfo removes sensitive information from the config. +func HideSensitiveInfo(cfg Config) Config { + // TODO: avoid printing sensitive data without need to resetting them manually (which is an error-prone approach) + for key, val := range cfg.Communications { + val.SocketSlack.AppToken = redactedSecretStr + val.SocketSlack.BotToken = redactedSecretStr + val.Elasticsearch.Password = redactedSecretStr + val.Discord.Token = redactedSecretStr + val.Mattermost.Token = redactedSecretStr + val.CloudSlack.Token = redactedSecretStr + // To keep the printed config readable, we don't print the certificate bytes. + val.CloudSlack.Server.TLS.CACertificate = nil + val.CloudTeams.Server.TLS.CACertificate = nil + + // Replace private channel names with aliases + cloudSlackChannels := make(IdentifiableMap[CloudSlackChannel]) + for _, channel := range val.CloudSlack.Channels { + if channel.Alias == nil { + cloudSlackChannels[channel.ChannelBindingsByName.Name] = channel + continue + } + + outChannel := channel + outChannel.ChannelBindingsByName.Name = fmt.Sprintf("%s (public alias)", *channel.Alias) + outChannel.Alias = nil + cloudSlackChannels[*channel.Alias] = outChannel + } + val.CloudSlack.Channels = cloudSlackChannels + + // maps are not addressable: https://stackoverflow.com/questions/42605337/cannot-assign-to-struct-field-in-a-map + cfg.Communications[key] = val + } + + return cfg +} diff --git a/pkg/execute/config.go b/pkg/execute/config.go index f4fcb9672..7be7d4bc5 100644 --- a/pkg/execute/config.go +++ b/pkg/execute/config.go @@ -48,54 +48,14 @@ func (e *ConfigExecutor) Commands() map[command.Verb]CommandFn { // Show returns Config in yaml format func (e *ConfigExecutor) Show(_ context.Context, cmdCtx CommandContext) (interactive.CoreMessage, error) { - cfg, err := e.renderBotkubeConfiguration() + redactedCfg := config.HideSensitiveInfo(e.cfg) + bytes, err := yaml.Marshal(redactedCfg) if err != nil { return interactive.CoreMessage{}, fmt.Errorf("while rendering Botkube configuration: %w", err) } - return respond(cfg, cmdCtx), nil -} - -const redactedSecretStr = "*** REDACTED ***" - -func (e *ConfigExecutor) renderBotkubeConfiguration() (string, error) { - cfg := e.cfg - - // hide sensitive info - // TODO: avoid printing sensitive data without need to resetting them manually (which is an error-prone approach) - for key, val := range cfg.Communications { - val.SocketSlack.AppToken = redactedSecretStr - val.SocketSlack.BotToken = redactedSecretStr - val.Elasticsearch.Password = redactedSecretStr - val.Discord.Token = redactedSecretStr - val.Mattermost.Token = redactedSecretStr - val.CloudSlack.Token = redactedSecretStr - // To keep the printed config readable, we don't print the certificate bytes. - val.CloudSlack.Server.TLS.CACertificate = nil - val.CloudTeams.Server.TLS.CACertificate = nil - - // Replace private channel names with aliases - cloudSlackChannels := make(config.IdentifiableMap[config.CloudSlackChannel]) - for _, channel := range val.CloudSlack.Channels { - if channel.Alias == nil { - cloudSlackChannels[channel.ChannelBindingsByName.Name] = channel - continue - } - outChannel := channel - outChannel.ChannelBindingsByName.Name = fmt.Sprintf("%s (public alias)", *channel.Alias) - outChannel.Alias = nil - cloudSlackChannels[*channel.Alias] = outChannel - } - val.CloudSlack.Channels = cloudSlackChannels - - // maps are not addressable: https://stackoverflow.com/questions/42605337/cannot-assign-to-struct-field-in-a-map - cfg.Communications[key] = val - } - - b, err := yaml.Marshal(cfg) if err != nil { - return "", err + return interactive.CoreMessage{}, fmt.Errorf("while rendering Botkube configuration: %w", err) } - - return string(b), nil + return respond(string(bytes), cmdCtx), nil }