version 2.0.0

This commit is contained in:
ston1th 2018-09-19 21:12:43 +02:00
commit de6a48c088
10 changed files with 84 additions and 108 deletions

View file

@ -1,20 +1,20 @@
// Copyright (C) 2017 Marius Schellenberger
// Copyright (C) 2018 Marius Schellenberger
// +build go1.11
// Package godrop provides a simple privileges dropping library
package godrop
import (
"errors"
"fmt"
"net"
"os"
"os/exec"
"os/signal"
"syscall"
)
func errf(err error) error {
return fmt.Errorf("godrop: %s", err)
func errf(i interface{}) error {
return fmt.Errorf("godrop: %s", i)
}
// Config represents the drop config
@ -45,7 +45,7 @@ func MultiDrop(c Config, f func() ([]net.Listener, error)) error {
return errf(err)
}
if uid == 0 {
return errf(errors.New("unable to drop privileges to uid 0 (root)"))
return errf("unable to drop privileges to uid 0 (root)")
}
gid, err := groupID(c.Group)
if err != nil {
@ -68,20 +68,14 @@ func MultiDrop(c Config, f func() ([]net.Listener, error)) error {
f, err = l.File()
l.Close()
default:
return errf(fmt.Errorf("index: %d listener is not type of either *net.TCPListener or *net.UnixListener", i))
return errf(fmt.Sprintf("index %d listener is not type of either *net.TCPListener or *net.UnixListener", i))
}
if err != nil {
return errf(fmt.Errorf("index: %d %s", i, err))
return errf(fmt.Sprintf("index %d %s", i, err))
}
cmd.ExtraFiles = append(cmd.ExtraFiles, f)
}
if c.Foreground {
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
}
cmd.SysProcAttr = &syscall.SysProcAttr{
Chroot: c.Chroot,
Credential: &syscall.Credential{
@ -91,17 +85,20 @@ func MultiDrop(c Config, f func() ([]net.Listener, error)) error {
Setsid: true,
}
if c.Foreground {
cmd.SysProcAttr.Setctty = true
cmd.Stdin = os.Stdin
cmd.Stdout = os.Stdout
cmd.Stderr = os.Stderr
} else {
cmd.SysProcAttr.Noctty = true
}
if err := cmd.Start(); err != nil {
return errf(err)
}
if c.Foreground {
go func() {
sigs := make(chan os.Signal)
signal.Notify(sigs, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT)
sig := <-sigs
cmd.Process.Signal(sig)
}()
_ = cmd.Wait()
os.Exit(int(cmd.ProcessState.Sys().(syscall.WaitStatus)))
}
@ -110,7 +107,7 @@ func MultiDrop(c Config, f func() ([]net.Listener, error)) error {
case uid:
return nil
}
return errf(errors.New("dropping priviledges failed"))
return errf("dropping priviledges failed")
}
// GetListener returns the listener socket of file descriptor 3
@ -120,6 +117,9 @@ func GetListener() (net.Listener, error) {
// GetListenerFd returns the listener socket of the given file descriptor
func GetListenerFd(fd int) (net.Listener, error) {
if fd < 3 {
return nil, errf("fd is less than 3")
}
f := os.NewFile(uintptr(fd), "")
defer f.Close()
return net.FileListener(f)