From cc091ad488673b3baa2f1f07b1f0399561a08c4a Mon Sep 17 00:00:00 2001 From: Bernd Schoolmann Date: Thu, 28 Dec 2023 01:04:46 +0100 Subject: [PATCH] Add idle monitor --- agent/processsecurity/unimplemented.go | 4 +++ agent/processsecurity/unix.go | 39 ++++++++++++++++++++++---- agent/unixsocketagent.go | 26 +++++++++++------ 3 files changed, 55 insertions(+), 14 deletions(-) diff --git a/agent/processsecurity/unimplemented.go b/agent/processsecurity/unimplemented.go index d3ce08c..731da28 100644 --- a/agent/processsecurity/unimplemented.go +++ b/agent/processsecurity/unimplemented.go @@ -10,3 +10,7 @@ func DisableDumpable() error { func MonitorLocks(onlock func()) error { return nil } + +func MonitorIdle(onidle func()) error { + return nil +} diff --git a/agent/processsecurity/unix.go b/agent/processsecurity/unix.go index d14704d..45a8e62 100644 --- a/agent/processsecurity/unix.go +++ b/agent/processsecurity/unix.go @@ -3,14 +3,14 @@ package processsecurity import ( - "fmt" + "time" "github.com/godbus/dbus/v5" - "golang.org/x/sys/unix" ) 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 { @@ -22,7 +22,7 @@ func MonitorLocks(onlock func()) error { if err != nil { return err } - err = bus.AddMatchSignal(dbus.WithMatchMember("org.freedesktop.ScreenSaver")) + err = bus.AddMatchSignal(dbus.WithMatchInterface("org.freedesktop.ScreenSaver")) if err != nil { return err } @@ -32,8 +32,6 @@ func MonitorLocks(onlock func()) error { for { select { case message := <-signals: - fmt.Println("Message:", message) - fmt.Println("name ", message.Name) if message.Name == "org.gnome.ScreenSaver.ActiveChanged" { if len(message.Body) == 0 { continue @@ -57,3 +55,32 @@ func MonitorLocks(onlock func()) error { 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 +} diff --git a/agent/unixsocketagent.go b/agent/unixsocketagent.go index 728414c..37561e7 100644 --- a/agent/unixsocketagent.go +++ b/agent/unixsocketagent.go @@ -163,14 +163,24 @@ func StartUnixAgent(path string, runtimeConfig config.RuntimeConfig) error { } processsecurity.DisableDumpable() - err = processsecurity.MonitorLocks(func() { - cfg.Lock() - vault.Clear() - vault.Keyring.Lock() - }) - if err != nil { - log.Warn("Could not monitor screensaver: %s", err.Error()) - } + go func() { + err = processsecurity.MonitorLocks(func() { + cfg.Lock() + vault.Clear() + vault.Keyring.Lock() + }) + 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 { go bitwarden.RunWebsocketDaemon(ctx, vault, &cfg)