fix group string being always set to uid in case a user has a gid set

This commit is contained in:
Tejal Desai 2020-01-31 15:19:57 -08:00
parent c0c26bdcf2
commit 956495784e
3 changed files with 44 additions and 2 deletions

View File

@ -26,6 +26,11 @@ import (
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
// for testing
var (
Lookup = util.Lookup
)
type UserCommand struct { type UserCommand struct {
BaseCommand BaseCommand
cmd *instructions.UserCommand cmd *instructions.UserCommand
@ -40,7 +45,11 @@ func (r *UserCommand) ExecuteCommand(config *v1.Config, buildArgs *dockerfile.Bu
if err != nil { if err != nil {
return err return err
} }
groupStr := userStr userObj, err := Lookup(userStr)
if err != nil {
return err
}
groupStr := userObj.Gid
if len(userAndGroup) > 1 { if len(userAndGroup) > 1 {
groupStr, err = util.ResolveEnvironmentReplacement(userAndGroup[1], replacementEnvs, false) groupStr, err = util.ResolveEnvironmentReplacement(userAndGroup[1], replacementEnvs, false)
if err != nil { if err != nil {

View File

@ -16,9 +16,11 @@ limitations under the License.
package commands package commands
import ( import (
"os/user"
"testing" "testing"
"github.com/GoogleContainerTools/kaniko/pkg/dockerfile" "github.com/GoogleContainerTools/kaniko/pkg/dockerfile"
"github.com/GoogleContainerTools/kaniko/pkg/util"
"github.com/GoogleContainerTools/kaniko/testutil" "github.com/GoogleContainerTools/kaniko/testutil"
v1 "github.com/google/go-containerregistry/pkg/v1" v1 "github.com/google/go-containerregistry/pkg/v1"
@ -27,52 +29,64 @@ import (
var userTests = []struct { var userTests = []struct {
user string user string
userObj user.User
expectedUID string expectedUID string
expectedGID string expectedGID string
}{ }{
{ {
user: "root", user: "root",
userObj: user.User{Uid: "root", Gid: "root"},
expectedUID: "root:root", expectedUID: "root:root",
}, },
{ {
user: "root-add", user: "root-add",
expectedUID: "root-add:root-add", userObj: user.User{Uid: "root-add", Gid: "root"},
expectedUID: "root-add:root",
}, },
{ {
user: "0", user: "0",
userObj: user.User{Uid: "0", Gid: "0"},
expectedUID: "0:0", expectedUID: "0:0",
}, },
{ {
user: "fakeUser", user: "fakeUser",
userObj: user.User{Uid: "fakeUser", Gid: "fakeUser"},
expectedUID: "fakeUser:fakeUser", expectedUID: "fakeUser:fakeUser",
}, },
{ {
user: "root:root", user: "root:root",
userObj: user.User{Uid: "root", Gid: "some"},
expectedUID: "root:root", expectedUID: "root:root",
}, },
{ {
user: "0:root", user: "0:root",
userObj: user.User{Uid: "0"},
expectedUID: "0:root", expectedUID: "0:root",
}, },
{ {
user: "root:0", user: "root:0",
userObj: user.User{Uid: "root"},
expectedUID: "root:0", expectedUID: "root:0",
expectedGID: "f0", expectedGID: "f0",
}, },
{ {
user: "0:0", user: "0:0",
userObj: user.User{Uid: "0"},
expectedUID: "0:0", expectedUID: "0:0",
}, },
{ {
user: "$envuser", user: "$envuser",
userObj: user.User{Uid: "root", Gid: "root"},
expectedUID: "root:root", expectedUID: "root:root",
}, },
{ {
user: "root:$envgroup", user: "root:$envgroup",
userObj: user.User{Uid: "root"},
expectedUID: "root:grp", expectedUID: "root:grp",
}, },
{ {
user: "some:grp", user: "some:grp",
userObj: user.User{Uid: "some"},
expectedUID: "some:grp", expectedUID: "some:grp",
}, },
} }
@ -90,6 +104,10 @@ func TestUpdateUser(t *testing.T) {
User: test.user, User: test.user,
}, },
} }
Lookup = func(_ string) (*user.User, error) {
return &test.userObj, nil
}
defer func() { Lookup = util.Lookup }()
buildArgs := dockerfile.NewBuildArgs([]string{}) buildArgs := dockerfile.NewBuildArgs([]string{})
err := cmd.ExecuteCommand(cfg, buildArgs) err := cmd.ExecuteCommand(cfg, buildArgs)
testutil.CheckErrorAndDeepEqual(t, false, err, test.expectedUID, cfg.User) testutil.CheckErrorAndDeepEqual(t, false, err, test.expectedUID, cfg.User)

View File

@ -363,3 +363,18 @@ func GetUserFromUsername(userStr string, groupStr string) (string, string, error
return uid, gid, nil return uid, gid, nil
} }
func Lookup(userStr string) (*user.User, error) {
userObj, err := user.Lookup(userStr)
if err != nil {
if _, ok := err.(user.UnknownUserError); !ok {
return nil, err
}
// Lookup by id
userObj, err = user.LookupId(userStr)
if err != nil {
return nil, err
}
}
return userObj, nil
}