2023-07-17 04:23:26 +03:00
|
|
|
package sockets
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net"
|
|
|
|
"os/user"
|
|
|
|
|
|
|
|
gops "github.com/mitchellh/go-ps"
|
|
|
|
"inet.af/peercred"
|
|
|
|
)
|
|
|
|
|
|
|
|
type CallingContext struct {
|
|
|
|
UserName string
|
|
|
|
ProcessName string
|
|
|
|
ParentProcessName string
|
|
|
|
GrandParentProcessName string
|
2023-09-12 19:56:35 +03:00
|
|
|
ProcessPid int
|
|
|
|
ParentProcessPid int
|
|
|
|
GrandParentProcessPid int
|
2023-07-17 04:23:26 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
func GetCallingContext(connection net.Conn) CallingContext {
|
|
|
|
creds, err := peercred.Get(connection)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
pid, _ := creds.PID()
|
|
|
|
process, err := gops.FindProcess(pid)
|
2023-09-19 23:27:03 +03:00
|
|
|
|
|
|
|
// git is epheremal and spawns ssh-keygen and ssh so we need to anchor to git
|
|
|
|
if process.Executable() == "ssh-keygen" || process.Executable() == "ssh" {
|
|
|
|
p, e := gops.FindProcess(process.PPid())
|
|
|
|
if p.Executable() == "git" && e == nil {
|
|
|
|
process, err = p, e
|
|
|
|
pid = process.Pid()
|
|
|
|
}
|
2023-09-19 23:14:03 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
uid, _ := creds.UserID()
|
2023-07-17 04:23:26 +03:00
|
|
|
ppid := process.PPid()
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
2023-09-12 03:54:46 +03:00
|
|
|
|
2023-07-17 04:23:26 +03:00
|
|
|
parentProcess, err := gops.FindProcess(ppid)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
parentParentProcess, err := gops.FindProcess(parentProcess.PPid())
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
username, err := user.LookupId(uid)
|
|
|
|
if err != nil {
|
|
|
|
panic(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return CallingContext{
|
|
|
|
UserName: username.Username,
|
|
|
|
ProcessName: process.Executable(),
|
|
|
|
ParentProcessName: parentProcess.Executable(),
|
|
|
|
GrandParentProcessName: parentParentProcess.Executable(),
|
2023-09-12 19:56:35 +03:00
|
|
|
ProcessPid: pid,
|
|
|
|
ParentProcessPid: ppid,
|
|
|
|
GrandParentProcessPid: parentParentProcess.PPid(),
|
2023-07-17 04:23:26 +03:00
|
|
|
}
|
|
|
|
}
|