2023-08-24 03:22:03 +02:00
|
|
|
//go:build linux || freebsd
|
|
|
|
|
|
|
|
package processsecurity
|
|
|
|
|
2023-12-23 08:37:17 +01:00
|
|
|
import (
|
2023-12-28 01:04:46 +01:00
|
|
|
"time"
|
2023-12-23 08:37:17 +01:00
|
|
|
|
|
|
|
"github.com/godbus/dbus/v5"
|
2023-12-28 13:42:54 +01:00
|
|
|
"golang.org/x/sys/unix"
|
2023-12-23 08:37:17 +01:00
|
|
|
)
|
2023-08-24 03:22:03 +02:00
|
|
|
|
|
|
|
func DisableDumpable() error {
|
2023-12-28 13:42:54 +01:00
|
|
|
return unix.Prctl(unix.PR_SET_DUMPABLE, 0, 0, 0, 0)
|
2023-08-24 03:22:03 +02:00
|
|
|
}
|
2023-12-23 08:37:17 +01:00
|
|
|
|
|
|
|
func MonitorLocks(onlock func()) error {
|
|
|
|
bus, err := dbus.SessionBus()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
err = bus.AddMatchSignal(dbus.WithMatchInterface("org.gnome.ScreenSaver"))
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
2023-12-28 01:04:46 +01:00
|
|
|
err = bus.AddMatchSignal(dbus.WithMatchInterface("org.freedesktop.ScreenSaver"))
|
2023-12-23 08:37:17 +01:00
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
signals := make(chan *dbus.Signal, 10)
|
|
|
|
bus.Signal(signals)
|
|
|
|
for {
|
|
|
|
select {
|
|
|
|
case message := <-signals:
|
|
|
|
if message.Name == "org.gnome.ScreenSaver.ActiveChanged" {
|
|
|
|
if len(message.Body) == 0 {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
locked, err := message.Body[0].(bool)
|
|
|
|
if err || locked {
|
|
|
|
onlock()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if message.Name == "org.freedesktop.ScreenSaver.ActiveChanged" {
|
|
|
|
if len(message.Body) == 0 {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
locked, err := message.Body[0].(bool)
|
|
|
|
if err || locked {
|
|
|
|
onlock()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|
2023-12-28 01:04:46 +01:00
|
|
|
|
|
|
|
func MonitorIdle(onidle func()) error {
|
|
|
|
bus, err := dbus.SessionBus()
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
var wasidle = false
|
|
|
|
for {
|
|
|
|
var res int64
|
|
|
|
err = bus.Object("org.gnome.Mutter.IdleMonitor", "/org/gnome/Mutter/IdleMonitor/Core").Call("org.gnome.Mutter.IdleMonitor.GetIdletime", 0).Store(&res)
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
secondsIdle := res / 1000
|
|
|
|
if secondsIdle > 60*1 {
|
|
|
|
if !wasidle {
|
|
|
|
wasidle = true
|
|
|
|
onidle()
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
wasidle = false
|
|
|
|
}
|
|
|
|
|
|
|
|
time.Sleep(1 * time.Second)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|