mirror of
https://github.com/containers/podman.git
synced 2025-08-24 18:12:25 +08:00
Merge pull request #25785 from containers/renovate/github.com-moby-sys-user-0.x
fix(deps): update module github.com/moby/sys/user to v0.4.0
This commit is contained in:
2
go.mod
2
go.mod
@ -47,7 +47,7 @@ require (
|
|||||||
github.com/mattn/go-sqlite3 v1.14.24
|
github.com/mattn/go-sqlite3 v1.14.24
|
||||||
github.com/mdlayher/vsock v1.2.1
|
github.com/mdlayher/vsock v1.2.1
|
||||||
github.com/moby/sys/capability v0.4.0
|
github.com/moby/sys/capability v0.4.0
|
||||||
github.com/moby/sys/user v0.3.0
|
github.com/moby/sys/user v0.4.0
|
||||||
github.com/moby/term v0.5.2
|
github.com/moby/term v0.5.2
|
||||||
github.com/nxadm/tail v1.4.11
|
github.com/nxadm/tail v1.4.11
|
||||||
github.com/onsi/ginkgo/v2 v2.23.3
|
github.com/onsi/ginkgo/v2 v2.23.3
|
||||||
|
4
go.sum
4
go.sum
@ -330,8 +330,8 @@ github.com/moby/sys/mountinfo v0.7.2 h1:1shs6aH5s4o5H2zQLn796ADW1wMrIwHsyJ2v9Kou
|
|||||||
github.com/moby/sys/mountinfo v0.7.2/go.mod h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4=
|
github.com/moby/sys/mountinfo v0.7.2/go.mod h1:1YOa8w8Ih7uW0wALDUgT1dTTSBrZ+HiBLGws92L2RU4=
|
||||||
github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU=
|
github.com/moby/sys/sequential v0.6.0 h1:qrx7XFUd/5DxtqcoH1h438hF5TmOvzC/lspjy7zgvCU=
|
||||||
github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko=
|
github.com/moby/sys/sequential v0.6.0/go.mod h1:uyv8EUTrca5PnDsdMGXhZe6CCe8U/UiTWd+lL+7b/Ko=
|
||||||
github.com/moby/sys/user v0.3.0 h1:9ni5DlcW5an3SvRSx4MouotOygvzaXbaSrc/wGDFWPo=
|
github.com/moby/sys/user v0.4.0 h1:jhcMKit7SA80hivmFJcbB1vqmw//wU61Zdui2eQXuMs=
|
||||||
github.com/moby/sys/user v0.3.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs=
|
github.com/moby/sys/user v0.4.0/go.mod h1:bG+tYYYJgaMtRKgEmuueC0hJEAZWwtIbZTB+85uoHjs=
|
||||||
github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g=
|
github.com/moby/sys/userns v0.1.0 h1:tVLXkFOxVu9A64/yh59slHVv9ahO9UIev4JZusOLG/g=
|
||||||
github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28=
|
github.com/moby/sys/userns v0.1.0/go.mod h1:IHUYgu/kao6N8YZlp9Cf444ySSvCmDlmzUcYfDHOl28=
|
||||||
github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ=
|
github.com/moby/term v0.5.2 h1:6qk3FJAFDs6i/q3W/pQ97SX192qKfZgGjCQqfCJkgzQ=
|
||||||
|
141
vendor/github.com/moby/sys/user/idtools.go
generated
vendored
Normal file
141
vendor/github.com/moby/sys/user/idtools.go
generated
vendored
Normal file
@ -0,0 +1,141 @@
|
|||||||
|
package user
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// MkdirOpt is a type for options to pass to Mkdir calls
|
||||||
|
type MkdirOpt func(*mkdirOptions)
|
||||||
|
|
||||||
|
type mkdirOptions struct {
|
||||||
|
onlyNew bool
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithOnlyNew is an option for MkdirAllAndChown that will only change ownership and permissions
|
||||||
|
// on newly created directories. If the directory already exists, it will not be modified
|
||||||
|
func WithOnlyNew(o *mkdirOptions) {
|
||||||
|
o.onlyNew = true
|
||||||
|
}
|
||||||
|
|
||||||
|
// MkdirAllAndChown creates a directory (include any along the path) and then modifies
|
||||||
|
// ownership to the requested uid/gid. By default, if the directory already exists, this
|
||||||
|
// function will still change ownership and permissions. If WithOnlyNew is passed as an
|
||||||
|
// option, then only the newly created directories will have ownership and permissions changed.
|
||||||
|
func MkdirAllAndChown(path string, mode os.FileMode, uid, gid int, opts ...MkdirOpt) error {
|
||||||
|
var options mkdirOptions
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(&options)
|
||||||
|
}
|
||||||
|
|
||||||
|
return mkdirAs(path, mode, uid, gid, true, options.onlyNew)
|
||||||
|
}
|
||||||
|
|
||||||
|
// MkdirAndChown creates a directory and then modifies ownership to the requested uid/gid.
|
||||||
|
// By default, if the directory already exists, this function still changes ownership and permissions.
|
||||||
|
// If WithOnlyNew is passed as an option, then only the newly created directory will have ownership
|
||||||
|
// and permissions changed.
|
||||||
|
// Note that unlike os.Mkdir(), this function does not return IsExist error
|
||||||
|
// in case path already exists.
|
||||||
|
func MkdirAndChown(path string, mode os.FileMode, uid, gid int, opts ...MkdirOpt) error {
|
||||||
|
var options mkdirOptions
|
||||||
|
for _, opt := range opts {
|
||||||
|
opt(&options)
|
||||||
|
}
|
||||||
|
return mkdirAs(path, mode, uid, gid, false, options.onlyNew)
|
||||||
|
}
|
||||||
|
|
||||||
|
// getRootUIDGID retrieves the remapped root uid/gid pair from the set of maps.
|
||||||
|
// If the maps are empty, then the root uid/gid will default to "real" 0/0
|
||||||
|
func getRootUIDGID(uidMap, gidMap []IDMap) (int, int, error) {
|
||||||
|
uid, err := toHost(0, uidMap)
|
||||||
|
if err != nil {
|
||||||
|
return -1, -1, err
|
||||||
|
}
|
||||||
|
gid, err := toHost(0, gidMap)
|
||||||
|
if err != nil {
|
||||||
|
return -1, -1, err
|
||||||
|
}
|
||||||
|
return uid, gid, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// toContainer takes an id mapping, and uses it to translate a
|
||||||
|
// host ID to the remapped ID. If no map is provided, then the translation
|
||||||
|
// assumes a 1-to-1 mapping and returns the passed in id
|
||||||
|
func toContainer(hostID int, idMap []IDMap) (int, error) {
|
||||||
|
if idMap == nil {
|
||||||
|
return hostID, nil
|
||||||
|
}
|
||||||
|
for _, m := range idMap {
|
||||||
|
if (int64(hostID) >= m.ParentID) && (int64(hostID) <= (m.ParentID + m.Count - 1)) {
|
||||||
|
contID := int(m.ID + (int64(hostID) - m.ParentID))
|
||||||
|
return contID, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1, fmt.Errorf("host ID %d cannot be mapped to a container ID", hostID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// toHost takes an id mapping and a remapped ID, and translates the
|
||||||
|
// ID to the mapped host ID. If no map is provided, then the translation
|
||||||
|
// assumes a 1-to-1 mapping and returns the passed in id #
|
||||||
|
func toHost(contID int, idMap []IDMap) (int, error) {
|
||||||
|
if idMap == nil {
|
||||||
|
return contID, nil
|
||||||
|
}
|
||||||
|
for _, m := range idMap {
|
||||||
|
if (int64(contID) >= m.ID) && (int64(contID) <= (m.ID + m.Count - 1)) {
|
||||||
|
hostID := int(m.ParentID + (int64(contID) - m.ID))
|
||||||
|
return hostID, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return -1, fmt.Errorf("container ID %d cannot be mapped to a host ID", contID)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IdentityMapping contains a mappings of UIDs and GIDs.
|
||||||
|
// The zero value represents an empty mapping.
|
||||||
|
type IdentityMapping struct {
|
||||||
|
UIDMaps []IDMap `json:"UIDMaps"`
|
||||||
|
GIDMaps []IDMap `json:"GIDMaps"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// RootPair returns a uid and gid pair for the root user. The error is ignored
|
||||||
|
// because a root user always exists, and the defaults are correct when the uid
|
||||||
|
// and gid maps are empty.
|
||||||
|
func (i IdentityMapping) RootPair() (int, int) {
|
||||||
|
uid, gid, _ := getRootUIDGID(i.UIDMaps, i.GIDMaps)
|
||||||
|
return uid, gid
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToHost returns the host UID and GID for the container uid, gid.
|
||||||
|
// Remapping is only performed if the ids aren't already the remapped root ids
|
||||||
|
func (i IdentityMapping) ToHost(uid, gid int) (int, int, error) {
|
||||||
|
var err error
|
||||||
|
ruid, rgid := i.RootPair()
|
||||||
|
|
||||||
|
if uid != ruid {
|
||||||
|
ruid, err = toHost(uid, i.UIDMaps)
|
||||||
|
if err != nil {
|
||||||
|
return ruid, rgid, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if gid != rgid {
|
||||||
|
rgid, err = toHost(gid, i.GIDMaps)
|
||||||
|
}
|
||||||
|
return ruid, rgid, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// ToContainer returns the container UID and GID for the host uid and gid
|
||||||
|
func (i IdentityMapping) ToContainer(uid, gid int) (int, int, error) {
|
||||||
|
ruid, err := toContainer(uid, i.UIDMaps)
|
||||||
|
if err != nil {
|
||||||
|
return -1, -1, err
|
||||||
|
}
|
||||||
|
rgid, err := toContainer(gid, i.GIDMaps)
|
||||||
|
return ruid, rgid, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Empty returns true if there are no id mappings
|
||||||
|
func (i IdentityMapping) Empty() bool {
|
||||||
|
return len(i.UIDMaps) == 0 && len(i.GIDMaps) == 0
|
||||||
|
}
|
143
vendor/github.com/moby/sys/user/idtools_unix.go
generated
vendored
Normal file
143
vendor/github.com/moby/sys/user/idtools_unix.go
generated
vendored
Normal file
@ -0,0 +1,143 @@
|
|||||||
|
//go:build !windows
|
||||||
|
|
||||||
|
package user
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"path/filepath"
|
||||||
|
"strconv"
|
||||||
|
"syscall"
|
||||||
|
)
|
||||||
|
|
||||||
|
func mkdirAs(path string, mode os.FileMode, uid, gid int, mkAll, onlyNew bool) error {
|
||||||
|
path, err := filepath.Abs(path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
stat, err := os.Stat(path)
|
||||||
|
if err == nil {
|
||||||
|
if !stat.IsDir() {
|
||||||
|
return &os.PathError{Op: "mkdir", Path: path, Err: syscall.ENOTDIR}
|
||||||
|
}
|
||||||
|
if onlyNew {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// short-circuit -- we were called with an existing directory and chown was requested
|
||||||
|
return setPermissions(path, mode, uid, gid, stat)
|
||||||
|
}
|
||||||
|
|
||||||
|
// make an array containing the original path asked for, plus (for mkAll == true)
|
||||||
|
// all path components leading up to the complete path that don't exist before we MkdirAll
|
||||||
|
// so that we can chown all of them properly at the end. If onlyNew is true, we won't
|
||||||
|
// chown the full directory path if it exists
|
||||||
|
var paths []string
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
paths = append(paths, path)
|
||||||
|
}
|
||||||
|
|
||||||
|
if mkAll {
|
||||||
|
// walk back to "/" looking for directories which do not exist
|
||||||
|
// and add them to the paths array for chown after creation
|
||||||
|
dirPath := path
|
||||||
|
for {
|
||||||
|
dirPath = filepath.Dir(dirPath)
|
||||||
|
if dirPath == "/" {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if _, err = os.Stat(dirPath); os.IsNotExist(err) {
|
||||||
|
paths = append(paths, dirPath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err = os.MkdirAll(path, mode); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
} else if err = os.Mkdir(path, mode); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
// even if it existed, we will chown the requested path + any subpaths that
|
||||||
|
// didn't exist when we called MkdirAll
|
||||||
|
for _, pathComponent := range paths {
|
||||||
|
if err = setPermissions(pathComponent, mode, uid, gid, nil); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// setPermissions performs a chown/chmod only if the uid/gid don't match what's requested
|
||||||
|
// Normally a Chown is a no-op if uid/gid match, but in some cases this can still cause an error, e.g. if the
|
||||||
|
// dir is on an NFS share, so don't call chown unless we absolutely must.
|
||||||
|
// Likewise for setting permissions.
|
||||||
|
func setPermissions(p string, mode os.FileMode, uid, gid int, stat os.FileInfo) error {
|
||||||
|
if stat == nil {
|
||||||
|
var err error
|
||||||
|
stat, err = os.Stat(p)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if stat.Mode().Perm() != mode.Perm() {
|
||||||
|
if err := os.Chmod(p, mode.Perm()); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ssi := stat.Sys().(*syscall.Stat_t)
|
||||||
|
if ssi.Uid == uint32(uid) && ssi.Gid == uint32(gid) {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
return os.Chown(p, uid, gid)
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoadIdentityMapping takes a requested username and
|
||||||
|
// using the data from /etc/sub{uid,gid} ranges, creates the
|
||||||
|
// proper uid and gid remapping ranges for that user/group pair
|
||||||
|
func LoadIdentityMapping(name string) (IdentityMapping, error) {
|
||||||
|
// TODO: Consider adding support for calling out to "getent"
|
||||||
|
usr, err := LookupUser(name)
|
||||||
|
if err != nil {
|
||||||
|
return IdentityMapping{}, fmt.Errorf("could not get user for username %s: %w", name, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
subuidRanges, err := lookupSubRangesFile("/etc/subuid", usr)
|
||||||
|
if err != nil {
|
||||||
|
return IdentityMapping{}, err
|
||||||
|
}
|
||||||
|
subgidRanges, err := lookupSubRangesFile("/etc/subgid", usr)
|
||||||
|
if err != nil {
|
||||||
|
return IdentityMapping{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return IdentityMapping{
|
||||||
|
UIDMaps: subuidRanges,
|
||||||
|
GIDMaps: subgidRanges,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func lookupSubRangesFile(path string, usr User) ([]IDMap, error) {
|
||||||
|
uidstr := strconv.Itoa(usr.Uid)
|
||||||
|
rangeList, err := ParseSubIDFileFilter(path, func(sid SubID) bool {
|
||||||
|
return sid.Name == usr.Name || sid.Name == uidstr
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if len(rangeList) == 0 {
|
||||||
|
return nil, fmt.Errorf("no subuid ranges found for user %q", usr.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
idMap := []IDMap{}
|
||||||
|
|
||||||
|
var containerID int64
|
||||||
|
for _, idrange := range rangeList {
|
||||||
|
idMap = append(idMap, IDMap{
|
||||||
|
ID: containerID,
|
||||||
|
ParentID: idrange.SubID,
|
||||||
|
Count: idrange.Count,
|
||||||
|
})
|
||||||
|
containerID = containerID + idrange.Count
|
||||||
|
}
|
||||||
|
return idMap, nil
|
||||||
|
}
|
13
vendor/github.com/moby/sys/user/idtools_windows.go
generated
vendored
Normal file
13
vendor/github.com/moby/sys/user/idtools_windows.go
generated
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package user
|
||||||
|
|
||||||
|
import (
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
// This is currently a wrapper around [os.MkdirAll] since currently
|
||||||
|
// permissions aren't set through this path, the identity isn't utilized.
|
||||||
|
// Ownership is handled elsewhere, but in the future could be support here
|
||||||
|
// too.
|
||||||
|
func mkdirAs(path string, _ os.FileMode, _, _ int, _, _ bool) error {
|
||||||
|
return os.MkdirAll(path, 0)
|
||||||
|
}
|
2
vendor/modules.txt
vendored
2
vendor/modules.txt
vendored
@ -727,7 +727,7 @@ github.com/moby/sys/mountinfo
|
|||||||
# github.com/moby/sys/sequential v0.6.0
|
# github.com/moby/sys/sequential v0.6.0
|
||||||
## explicit; go 1.17
|
## explicit; go 1.17
|
||||||
github.com/moby/sys/sequential
|
github.com/moby/sys/sequential
|
||||||
# github.com/moby/sys/user v0.3.0
|
# github.com/moby/sys/user v0.4.0
|
||||||
## explicit; go 1.17
|
## explicit; go 1.17
|
||||||
github.com/moby/sys/user
|
github.com/moby/sys/user
|
||||||
# github.com/moby/sys/userns v0.1.0
|
# github.com/moby/sys/userns v0.1.0
|
||||||
|
Reference in New Issue
Block a user