Browse code

Honor user passed on container in nsinit Docker-DCO-1.1-Signed-off-by: Michael Crosby <michael@crosbymichael.com> (github: crosbymichael)

Michael Crosby authored on 2014/02/25 06:52:56
Showing 2 changed files
... ...
@@ -8,6 +8,7 @@ import (
8 8
 	"github.com/dotcloud/docker/pkg/libcontainer/capabilities"
9 9
 	"github.com/dotcloud/docker/pkg/libcontainer/network"
10 10
 	"github.com/dotcloud/docker/pkg/system"
11
+	"github.com/dotcloud/docker/pkg/user"
11 12
 	"log"
12 13
 	"os"
13 14
 	"os/exec"
... ...
@@ -110,15 +111,30 @@ func resolveRootfs(uncleanRootfs string) (string, error) {
110 110
 }
111 111
 
112 112
 func setupUser(container *libcontainer.Container) error {
113
-	// TODO: honor user passed on container
114
-	if err := system.Setgroups(nil); err != nil {
115
-		return err
116
-	}
117
-	if err := system.Setresgid(0, 0, 0); err != nil {
118
-		return err
119
-	}
120
-	if err := system.Setresuid(0, 0, 0); err != nil {
121
-		return err
113
+	if container.User != "" {
114
+		uid, gid, suppGids, err := user.GetUserGroupSupplementary(container.User, syscall.Getuid(), syscall.Getgid())
115
+		if err != nil {
116
+			return err
117
+		}
118
+		if err := system.Setgroups(suppGids); err != nil {
119
+			return err
120
+		}
121
+		if err := system.Setgid(gid); err != nil {
122
+			return err
123
+		}
124
+		if err := system.Setuid(uid); err != nil {
125
+			return err
126
+		}
127
+	} else {
128
+		if err := system.Setgroups(nil); err != nil {
129
+			return err
130
+		}
131
+		if err := system.Setresgid(0, 0, 0); err != nil {
132
+			return err
133
+		}
134
+		if err := system.Setresuid(0, 0, 0); err != nil {
135
+			return err
136
+		}
122 137
 	}
123 138
 	return nil
124 139
 }
... ...
@@ -71,6 +71,14 @@ func Setresuid(ruid, euid, suid int) error {
71 71
 	return syscall.Setresuid(ruid, euid, suid)
72 72
 }
73 73
 
74
+func Setgid(gid int) error {
75
+	return syscall.Setgid(gid)
76
+}
77
+
78
+func Setuid(uid int) error {
79
+	return syscall.Setuid(uid)
80
+}
81
+
74 82
 func Sethostname(name string) error {
75 83
 	return syscall.Sethostname([]byte(name))
76 84
 }