mirror of
https://github.com/OliveTin/OliveTin
synced 2025-12-17 11:35:36 +00:00
Some checks failed
Build Snapshot / build-snapshot (push) Has been cancelled
CodeQL / Analyze (go) (push) Has been cancelled
CodeQL / Analyze (javascript) (push) Has been cancelled
Codestyle checks / codestyle (push) Has been cancelled
DevSkim / DevSkim (push) Has been cancelled
121 lines
2.7 KiB
Go
121 lines
2.7 KiB
Go
package config
|
|
|
|
import (
|
|
"github.com/google/uuid"
|
|
log "github.com/sirupsen/logrus"
|
|
"strings"
|
|
)
|
|
|
|
// Sanitize will look for common configuration issues, and fix them. For example,
|
|
// populating undefined fields - name -> title, etc.
|
|
func (cfg *Config) Sanitize() {
|
|
cfg.sanitizeLogLevel()
|
|
|
|
// log.Infof("cfg %p", cfg)
|
|
|
|
for idx := range cfg.Actions {
|
|
cfg.Actions[idx].sanitize(cfg)
|
|
}
|
|
}
|
|
|
|
func (cfg *Config) sanitizeLogLevel() {
|
|
if logLevel, err := log.ParseLevel(cfg.LogLevel); err == nil {
|
|
log.Info("Setting log level to ", logLevel)
|
|
log.SetLevel(logLevel)
|
|
}
|
|
}
|
|
|
|
func (action *Action) sanitize(cfg *Config) {
|
|
if action.Timeout < 3 {
|
|
action.Timeout = 3
|
|
}
|
|
|
|
action.ID = getActionID(action)
|
|
action.Icon = lookupHTMLIcon(action.Icon, cfg.DefaultIconForActions)
|
|
action.PopupOnStart = sanitizePopupOnStart(action.PopupOnStart, cfg)
|
|
|
|
if action.MaxConcurrent < 1 {
|
|
action.MaxConcurrent = 1
|
|
}
|
|
|
|
for idx := range action.Arguments {
|
|
action.Arguments[idx].sanitize()
|
|
}
|
|
|
|
sanitizeAuthRequireGuestsToLogin(cfg)
|
|
sanitizeLogHistoryPageSize(cfg)
|
|
}
|
|
|
|
func sanitizeAuthRequireGuestsToLogin(cfg *Config) {
|
|
if cfg.AuthRequireGuestsToLogin {
|
|
log.Infof("AuthRequireGuestsToLogin is enabled. All defaultPermissions will be set to false")
|
|
|
|
cfg.DefaultPermissions.View = false
|
|
cfg.DefaultPermissions.Exec = false
|
|
cfg.DefaultPermissions.Logs = false
|
|
}
|
|
}
|
|
|
|
func sanitizeLogHistoryPageSize(cfg *Config) {
|
|
if cfg.LogHistoryPageSize < 10 {
|
|
log.Warnf("LogsHistoryLimit is too low, setting it to 10")
|
|
cfg.LogHistoryPageSize = 10
|
|
} else if cfg.LogHistoryPageSize > 100 {
|
|
log.Warnf("LogsHistoryLimit is high, you can do this, but expect browser lag.")
|
|
}
|
|
}
|
|
|
|
func getActionID(action *Action) string {
|
|
if action.ID == "" {
|
|
return uuid.NewString()
|
|
}
|
|
|
|
if strings.Contains(action.ID, "{{") {
|
|
log.Fatalf("Action IDs cannot contain variables")
|
|
}
|
|
|
|
return action.ID
|
|
}
|
|
|
|
//gocyclo:ignore
|
|
func sanitizePopupOnStart(raw string, cfg *Config) string {
|
|
switch raw {
|
|
case "execution-dialog":
|
|
return raw
|
|
case "execution-dialog-output-html":
|
|
return raw
|
|
case "execution-dialog-stdout-only":
|
|
return raw
|
|
case "execution-button":
|
|
return raw
|
|
default:
|
|
return cfg.DefaultPopupOnStart
|
|
}
|
|
}
|
|
|
|
func (arg *ActionArgument) sanitize() {
|
|
if arg.Title == "" {
|
|
arg.Title = arg.Name
|
|
}
|
|
|
|
for idx, choice := range arg.Choices {
|
|
if choice.Title == "" {
|
|
arg.Choices[idx].Title = choice.Value
|
|
}
|
|
}
|
|
|
|
arg.sanitizeNoType()
|
|
|
|
// TODO Validate the default against the type checker, but this creates a
|
|
// import loop
|
|
}
|
|
|
|
func (arg *ActionArgument) sanitizeNoType() {
|
|
if len(arg.Choices) == 0 && arg.Type == "" {
|
|
log.WithFields(log.Fields{
|
|
"arg": arg.Name,
|
|
}).Warn("Argument type isn't set, will default to 'ascii' but this may not be safe. You should set a type specifically.")
|
|
arg.Type = "ascii"
|
|
}
|
|
}
|