aboutsummaryrefslogtreecommitdiffhomepage
path: root/hst/config.go
diff options
context:
space:
mode:
Diffstat (limited to 'hst/config.go')
-rw-r--r--hst/config.go47
1 files changed, 36 insertions, 11 deletions
diff --git a/hst/config.go b/hst/config.go
index 6b7e26f4..927f60ab 100644
--- a/hst/config.go
+++ b/hst/config.go
@@ -140,21 +140,29 @@ var (
ErrInsecure = errors.New("configuration is insecure")
)
+const (
+ // VAllowInsecure allows use of compatibility options considered insecure
+ // under any configuration, to work around ecosystem-wide flaws.
+ VAllowInsecure = 1 << iota
+)
+
// Validate checks [Config] and returns [AppError] if an invalid value is encountered.
-func (config *Config) Validate() error {
+func (config *Config) Validate(flags int) error {
+ const step = "validate configuration"
+
if config == nil {
- return &AppError{Step: "validate configuration", Err: ErrConfigNull,
+ return &AppError{Step: step, Err: ErrConfigNull,
Msg: "invalid configuration"}
}
// this is checked again in hsu
if config.Identity < IdentityStart || config.Identity > IdentityEnd {
- return &AppError{Step: "validate configuration", Err: ErrIdentityBounds,
+ return &AppError{Step: step, Err: ErrIdentityBounds,
Msg: "identity " + strconv.Itoa(config.Identity) + " out of range"}
}
if config.SchedPolicy < 0 || config.SchedPolicy > ext.SCHED_LAST {
- return &AppError{Step: "validate configuration", Err: ErrSchedPolicyBounds,
+ return &AppError{Step: step, Err: ErrSchedPolicyBounds,
Msg: "scheduling policy " +
strconv.Itoa(int(config.SchedPolicy)) +
" out of range"}
@@ -168,34 +176,51 @@ func (config *Config) Validate() error {
}
if config.Container == nil {
- return &AppError{Step: "validate configuration", Err: ErrConfigNull,
+ return &AppError{Step: step, Err: ErrConfigNull,
Msg: "configuration missing container state"}
}
if config.Container.Home == nil {
- return &AppError{Step: "validate configuration", Err: ErrConfigNull,
+ return &AppError{Step: step, Err: ErrConfigNull,
Msg: "container configuration missing path to home directory"}
}
if config.Container.Shell == nil {
- return &AppError{Step: "validate configuration", Err: ErrConfigNull,
+ return &AppError{Step: step, Err: ErrConfigNull,
Msg: "container configuration missing path to shell"}
}
if config.Container.Path == nil {
- return &AppError{Step: "validate configuration", Err: ErrConfigNull,
+ return &AppError{Step: step, Err: ErrConfigNull,
Msg: "container configuration missing path to initial program"}
}
for key := range config.Container.Env {
if strings.IndexByte(key, '=') != -1 || strings.IndexByte(key, 0) != -1 {
- return &AppError{Step: "validate configuration", Err: ErrEnviron,
+ return &AppError{Step: step, Err: ErrEnviron,
Msg: "invalid environment variable " + strconv.Quote(key)}
}
}
- if et := config.Enablements.Unwrap(); !config.DirectPulse && et&EPulse != 0 {
- return &AppError{Step: "validate configuration", Err: ErrInsecure,
+ et := config.Enablements.Unwrap()
+ if !config.DirectPulse && et&EPulse != 0 {
+ return &AppError{Step: step, Err: ErrInsecure,
Msg: "enablement PulseAudio is insecure and no longer supported"}
}
+ if flags&VAllowInsecure == 0 {
+ switch {
+ case et&EWayland != 0 && config.DirectWayland:
+ return &AppError{Step: step, Err: ErrInsecure,
+ Msg: "direct_wayland is insecure and no longer supported"}
+
+ case et&EPipeWire != 0 && config.DirectPipeWire:
+ return &AppError{Step: step, Err: ErrInsecure,
+ Msg: "direct_pipewire is insecure and no longer supported"}
+
+ case et&EPulse != 0 && config.DirectPulse:
+ return &AppError{Step: step, Err: ErrInsecure,
+ Msg: "direct_pulse is insecure and no longer supported"}
+ }
+ }
+
return nil
}