mirror of
https://github.com/safing/portmaster
synced 2025-09-01 18:19:12 +00:00
60 lines
1.3 KiB
Go
60 lines
1.3 KiB
Go
package status
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/safing/portbase/log"
|
|
)
|
|
|
|
type knownThreats struct {
|
|
sync.RWMutex
|
|
// active threats and their recommended mitigation level
|
|
list map[string]uint8
|
|
}
|
|
|
|
var threats = &knownThreats{
|
|
list: make(map[string]uint8),
|
|
}
|
|
|
|
// SetMitigationLevel sets the mitigation level for id
|
|
// to mitigation. If mitigation is SecurityLevelOff the
|
|
// mitigation record will be removed. If mitigation is
|
|
// an invalid level the call to SetMitigationLevel is a
|
|
// no-op.
|
|
func SetMitigationLevel(id string, mitigation uint8) {
|
|
if !IsValidSecurityLevel(mitigation) {
|
|
log.Warningf("tried to set invalid mitigation level %d for threat %s", mitigation, id)
|
|
return
|
|
}
|
|
|
|
defer triggerAutopilot()
|
|
|
|
threats.Lock()
|
|
defer threats.Unlock()
|
|
if mitigation == 0 {
|
|
delete(threats.list, id)
|
|
} else {
|
|
threats.list[id] = mitigation
|
|
}
|
|
}
|
|
|
|
// DeleteMitigationLevel deletes the mitigation level for id.
|
|
func DeleteMitigationLevel(id string) {
|
|
SetMitigationLevel(id, SecurityLevelOff)
|
|
}
|
|
|
|
// getHighestMitigationLevel returns the highest mitigation
|
|
// level set on a threat.
|
|
func getHighestMitigationLevel() uint8 {
|
|
threats.RLock()
|
|
defer threats.RUnlock()
|
|
|
|
var level uint8 = SecurityLevelNormal
|
|
for _, lvl := range threats.list {
|
|
if lvl > level {
|
|
level = lvl
|
|
}
|
|
}
|
|
|
|
return level
|
|
}
|