server: now change effective user/group if current user == 0
This commit is contained in:
+42
-24
@@ -150,43 +150,59 @@ func (srv *Server) Build() error {
|
||||
var err error
|
||||
//srv.logg.Infof("Server building")
|
||||
|
||||
usr, err := user.Lookup(srv.conf.RunUser)
|
||||
currUser, err := user.Current()
|
||||
if err != nil {
|
||||
err = fmt.Errorf("Error getting current user: %v\n", err)
|
||||
return err
|
||||
}
|
||||
cuid64, err := strconv.ParseInt(currUser.Uid, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
uid64, err := strconv.ParseInt(usr.Uid, 10, 64)
|
||||
cgid64, err := strconv.ParseInt(currUser.Gid, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
gid64, err := strconv.ParseInt(usr.Gid, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
euid := int(cuid64)
|
||||
egid := int(cgid64)
|
||||
if cuid64 == 0 {
|
||||
usr, err := user.Lookup(srv.conf.RunUser)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
uid64, err := strconv.ParseInt(usr.Uid, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
gid64, err := strconv.ParseInt(usr.Gid, 10, 64)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
euid = int(uid64)
|
||||
egid = int(gid64)
|
||||
}
|
||||
uid := int(uid64)
|
||||
gid := int(gid64)
|
||||
|
||||
// Creating datadir
|
||||
datadir := srv.conf.Datadir
|
||||
if !auxtool.DirExists(datadir) { // TODO: check access to dir
|
||||
srv.logg.Infof("Creating data directory %s ", datadir)
|
||||
//srv.logg.Infof("Creating data directory %s ", datadir)
|
||||
err = os.MkdirAll(datadir, 0750)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
err = os.Chown(datadir, uid, gid)
|
||||
err = os.Chown(datadir, euid, egid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if srv.conf.AsDaemon {
|
||||
logdir := filepath.Dir(srv.conf.Logpath)
|
||||
srv.logg.Infof("Creating log directory %s", logdir)
|
||||
//srv.logg.Infof("Creating log directory %s", logdir)
|
||||
err = os.MkdirAll(logdir, 0750)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = os.Chown(logdir, uid, gid)
|
||||
err = os.Chown(logdir, euid, egid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -196,7 +212,7 @@ func (srv *Server) Build() error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = os.Chown(rundir, uid, gid)
|
||||
err = os.Chown(rundir, euid, egid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -239,7 +255,7 @@ func (srv *Server) Build() error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = os.Chown(datadir, uid, gid)
|
||||
err = os.Chown(datadir, euid, egid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
@@ -252,22 +268,24 @@ func (srv *Server) Build() error {
|
||||
}
|
||||
srv.listen = listener
|
||||
|
||||
// Change effective user amd group
|
||||
err = syscall.Setuid(uid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = syscall.Setgid(gid)
|
||||
if err != nil {
|
||||
return err
|
||||
if cuid64 == 0 {
|
||||
// Change effective user and group
|
||||
err = syscall.Setuid(euid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
err = syscall.Setgid(egid)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
uidstr := strconv.FormatInt(int64(syscall.Geteuid()), 10)
|
||||
usr, err = user.LookupId(uidstr)
|
||||
usr, err := user.LookupId(uidstr)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
srv.logg.Warningf("Now run as user: %s", usr.Username)
|
||||
|
||||
// Creating database
|
||||
mdb := maindb.NewDatabase(dbdir)
|
||||
srv.logg.Infof("Opening main database")
|
||||
|
||||
Reference in New Issue
Block a user