mirror of
https://github.com/safing/portmaster
synced 2025-09-01 18:19:12 +00:00
116 lines
2.8 KiB
Go
116 lines
2.8 KiB
Go
package firewall
|
||
|
||
import (
|
||
"context"
|
||
|
||
"github.com/safing/portbase/config"
|
||
"github.com/safing/portbase/log"
|
||
"github.com/safing/portbase/modules"
|
||
"github.com/safing/portbase/modules/subsystems"
|
||
_ "github.com/safing/portmaster/core"
|
||
"github.com/safing/portmaster/network"
|
||
)
|
||
|
||
var module *modules.Module
|
||
|
||
func init() {
|
||
module = modules.Register("filter", prep, start, stop, "core", "interception", "intel")
|
||
subsystems.Register(
|
||
"filter",
|
||
"Privacy Filter",
|
||
"DNS and Network Filter",
|
||
module,
|
||
"config:filter/",
|
||
&config.Option{
|
||
Name: "Privacy Filter Module",
|
||
Key: CfgOptionEnableFilterKey,
|
||
Description: "Start the Privacy Filter module. If turned off, all privacy filter protections are fully disabled on this device.",
|
||
OptType: config.OptTypeBool,
|
||
ExpertiseLevel: config.ExpertiseLevelDeveloper,
|
||
ReleaseLevel: config.ReleaseLevelStable,
|
||
DefaultValue: true,
|
||
Annotations: config.Annotations{
|
||
config.CategoryAnnotation: "General",
|
||
},
|
||
},
|
||
)
|
||
}
|
||
|
||
const (
|
||
configChangeEvent = "config change"
|
||
profileConfigChangeEvent = "profile config change"
|
||
onSPNConnectEvent = "spn connect"
|
||
)
|
||
|
||
func prep() error {
|
||
network.SetDefaultFirewallHandler(verdictHandler)
|
||
|
||
// Reset connections every time configuration changes
|
||
// this will be triggered on spn enable/disable
|
||
err := module.RegisterEventHook(
|
||
"config",
|
||
configChangeEvent,
|
||
"reset connection verdicts",
|
||
func(ctx context.Context, _ interface{}) error {
|
||
resetAllConnectionVerdicts()
|
||
return nil
|
||
},
|
||
)
|
||
if err != nil {
|
||
log.Errorf("interception: failed registering event hook: %s", err)
|
||
}
|
||
|
||
// Reset connections every time profile changes
|
||
err = module.RegisterEventHook(
|
||
"profiles",
|
||
profileConfigChangeEvent,
|
||
"reset connection verdicts",
|
||
func(ctx context.Context, _ interface{}) error {
|
||
resetAllConnectionVerdicts()
|
||
return nil
|
||
},
|
||
)
|
||
if err != nil {
|
||
log.Errorf("failed registering event hook: %s", err)
|
||
}
|
||
|
||
// Reset connections when spn is connected
|
||
// connect and disconnecting is triggered on config change event but connecting takеs more time
|
||
err = module.RegisterEventHook(
|
||
"captain",
|
||
onSPNConnectEvent,
|
||
"reset connection verdicts",
|
||
func(ctx context.Context, _ interface{}) error {
|
||
resetAllConnectionVerdicts()
|
||
return nil
|
||
},
|
||
)
|
||
if err != nil {
|
||
log.Errorf("failed registering event hook: %s", err)
|
||
}
|
||
|
||
if err := registerConfig(); err != nil {
|
||
return err
|
||
}
|
||
|
||
return prepAPIAuth()
|
||
}
|
||
|
||
func start() error {
|
||
getConfig()
|
||
startAPIAuth()
|
||
|
||
module.StartServiceWorker("packet handler", 0, packetHandler)
|
||
module.StartServiceWorker("bandwidth update handler", 0, bandwidthUpdateHandler)
|
||
|
||
// Start stat logger if logging is set to trace.
|
||
if log.GetLogLevel() == log.TraceLevel {
|
||
module.StartServiceWorker("stat logger", 0, statLogger)
|
||
}
|
||
|
||
return nil
|
||
}
|
||
|
||
func stop() error {
|
||
return nil
|
||
}
|