Add idle monitor

This commit is contained in:
Bernd Schoolmann 2023-12-28 01:04:46 +01:00
parent cc8413e37d
commit cc091ad488
No known key found for this signature in database
3 changed files with 55 additions and 14 deletions

View file

@ -10,3 +10,7 @@ func DisableDumpable() error {
func MonitorLocks(onlock func()) error { func MonitorLocks(onlock func()) error {
return nil return nil
} }
func MonitorIdle(onidle func()) error {
return nil
}

View file

@ -3,14 +3,14 @@
package processsecurity package processsecurity
import ( import (
"fmt" "time"
"github.com/godbus/dbus/v5" "github.com/godbus/dbus/v5"
"golang.org/x/sys/unix"
) )
func DisableDumpable() error { func DisableDumpable() error {
return unix.Prctl(unix.PR_SET_DUMPABLE, 0, 0, 0, 0) // return unix.Prctl(unix.PR_SET_DUMPABLE, 0, 0, 0, 0)
return nil
} }
func MonitorLocks(onlock func()) error { func MonitorLocks(onlock func()) error {
@ -22,7 +22,7 @@ func MonitorLocks(onlock func()) error {
if err != nil { if err != nil {
return err return err
} }
err = bus.AddMatchSignal(dbus.WithMatchMember("org.freedesktop.ScreenSaver")) err = bus.AddMatchSignal(dbus.WithMatchInterface("org.freedesktop.ScreenSaver"))
if err != nil { if err != nil {
return err return err
} }
@ -32,8 +32,6 @@ func MonitorLocks(onlock func()) error {
for { for {
select { select {
case message := <-signals: case message := <-signals:
fmt.Println("Message:", message)
fmt.Println("name ", message.Name)
if message.Name == "org.gnome.ScreenSaver.ActiveChanged" { if message.Name == "org.gnome.ScreenSaver.ActiveChanged" {
if len(message.Body) == 0 { if len(message.Body) == 0 {
continue continue
@ -57,3 +55,32 @@ func MonitorLocks(onlock func()) error {
return nil return nil
} }
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
}

View file

@ -163,14 +163,24 @@ func StartUnixAgent(path string, runtimeConfig config.RuntimeConfig) error {
} }
processsecurity.DisableDumpable() processsecurity.DisableDumpable()
err = processsecurity.MonitorLocks(func() { go func() {
cfg.Lock() err = processsecurity.MonitorLocks(func() {
vault.Clear() cfg.Lock()
vault.Keyring.Lock() vault.Clear()
}) vault.Keyring.Lock()
if err != nil { })
log.Warn("Could not monitor screensaver: %s", err.Error()) if err != nil {
} log.Warn("Could not monitor screensaver: %s", err.Error())
}
}()
go func() {
err = processsecurity.MonitorIdle(func() {
log.Warn("Idling detected but no action is implemented")
})
if err != nil {
log.Warn("Could not monitor idle: %s", err.Error())
}
}()
if !runtimeConfig.WebsocketDisabled { if !runtimeConfig.WebsocketDisabled {
go bitwarden.RunWebsocketDaemon(ctx, vault, &cfg) go bitwarden.RunWebsocketDaemon(ctx, vault, &cfg)