Skip to content

Commit 7fffa9d

Browse files
committed
Add parseUidGid, formatUidGid functions
Signed-off-by: Oleksandr Redko <[email protected]>
1 parent 46525c4 commit 7fffa9d

File tree

5 files changed

+37
-20
lines changed

5 files changed

+37
-20
lines changed

.golangci.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,3 +151,8 @@ linters-settings:
151151
- typeUnparen
152152
- unnamedResult
153153
- unnecessaryBlock
154+
issues:
155+
exclude-rules:
156+
# Allow using Uid, Gid in pkg/osutil.
157+
- path: "pkg/osutil/"
158+
text: "uid"

pkg/osutil/osutil_linux.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ const UnixPathMax = 108
1010

1111
// Stat is a selection of syscall.Stat_t
1212
type Stat struct {
13-
Uid uint32 //nolint:revive
13+
Uid uint32
1414
Gid uint32
1515
}
1616

pkg/osutil/osutil_others.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const UnixPathMax = 104
1313

1414
// Stat is a selection of syscall.Stat_t
1515
type Stat struct {
16-
Uid uint32 //nolint:revive
16+
Uid uint32
1717
Gid uint32
1818
}
1919

pkg/osutil/osutil_windows.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ const UnixPathMax = 108
1313

1414
// Stat is a selection of syscall.Stat_t
1515
type Stat struct {
16-
Uid uint32 //nolint:revive
16+
Uid uint32
1717
Gid uint32
1818
}
1919

pkg/osutil/user.go

Lines changed: 29 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616

1717
type User struct {
1818
User string
19-
Uid uint32 //nolint:revive
19+
Uid uint32
2020
Group string
2121
Gid uint32
2222
Home string
@@ -30,11 +30,9 @@ type Group struct {
3030
var users map[string]User
3131
var groups map[string]Group
3232

33-
// regexUidGid detects valid Linux uid or gid.
34-
var regexUidGid = regexp.MustCompile("^[0-9]+$") //nolint:revive
35-
3633
// regexUsername matches user and group names to be valid for `useradd`.
37-
// It allows a trailing '$', but it feels prudent to map those to the fallback user as well.
34+
// `useradd` allows names with a trailing '$', but it feels prudent to map those
35+
// names to the fallback user as well, so the regex does not allow them.
3836
var regexUsername = regexp.MustCompile("^[a-z_][a-z0-9_-]*$")
3937

4038
// regexPath detects valid Linux path.
@@ -53,15 +51,15 @@ func LookupUser(name string) (User, error) {
5351
if err != nil {
5452
return User{}, err
5553
}
56-
uid, err := strconv.ParseUint(u.Uid, 10, 32)
54+
uid, err := parseUidGid(u.Uid)
5755
if err != nil {
5856
return User{}, err
5957
}
60-
gid, err := strconv.ParseUint(u.Gid, 10, 32)
58+
gid, err := parseUidGid(u.Gid)
6159
if err != nil {
6260
return User{}, err
6361
}
64-
users[name] = User{User: u.Username, Uid: uint32(uid), Group: g.Name, Gid: uint32(gid), Home: u.HomeDir}
62+
users[name] = User{User: u.Username, Uid: uid, Group: g.Name, Gid: gid, Home: u.HomeDir}
6563
}
6664
return users[name], nil
6765
}
@@ -75,18 +73,18 @@ func LookupGroup(name string) (Group, error) {
7573
if err != nil {
7674
return Group{}, err
7775
}
78-
gid, err := strconv.ParseUint(g.Gid, 10, 32)
76+
gid, err := parseUidGid(g.Gid)
7977
if err != nil {
8078
return Group{}, err
8179
}
82-
groups[name] = Group{Name: g.Name, Gid: uint32(gid)}
80+
groups[name] = Group{Name: g.Name, Gid: gid}
8381
}
8482
return groups[name], nil
8583
}
8684

8785
const (
8886
fallbackUser = "lima"
89-
fallbackUid = 1000 //nolint:revive
87+
fallbackUid = 1000
9088
fallbackGid = 1000
9189
)
9290

@@ -122,29 +120,29 @@ func LimaUser(warn bool) (*user.User, error) {
122120
if err != nil {
123121
logrus.Debug(err)
124122
}
125-
uid, err := strconv.ParseUint(idu, 10, 32)
123+
uid, err := parseUidGid(idu)
126124
if err != nil {
127125
uid = fallbackUid
128126
}
129-
if !regexUidGid.MatchString(cache.u.Uid) {
127+
if _, err := parseUidGid(cache.u.Uid); err != nil {
130128
warning := fmt.Sprintf("local uid %q is not a valid Linux uid (must be integer); using %d uid instead",
131129
cache.u.Uid, uid)
132130
cache.warnings = append(cache.warnings, warning)
133-
cache.u.Uid = fmt.Sprintf("%d", uid)
131+
cache.u.Uid = formatUidGid(uid)
134132
}
135133
idg, err := call([]string{"id", "-g"})
136134
if err != nil {
137135
logrus.Debug(err)
138136
}
139-
gid, err := strconv.ParseUint(idg, 10, 32)
137+
gid, err := parseUidGid(idg)
140138
if err != nil {
141139
gid = fallbackGid
142140
}
143-
if !regexUidGid.MatchString(cache.u.Gid) {
141+
if _, err := parseUidGid(cache.u.Gid); err != nil {
144142
warning := fmt.Sprintf("local gid %q is not a valid Linux gid (must be integer); using %d gid instead",
145143
cache.u.Gid, gid)
146144
cache.warnings = append(cache.warnings, warning)
147-
cache.u.Gid = fmt.Sprintf("%d", gid)
145+
cache.u.Gid = formatUidGid(gid)
148146
}
149147
home, err := call([]string{"cygpath", cache.u.HomeDir})
150148
if err != nil {
@@ -173,3 +171,17 @@ func LimaUser(warn bool) (*user.User, error) {
173171
}
174172
return cache.u, cache.err
175173
}
174+
175+
// parseUidGid converts string value to Linux uid or gid.
176+
func parseUidGid(uidOrGid string) (uint32, error) {
177+
res, err := strconv.ParseUint(uidOrGid, 10, 32)
178+
if err != nil {
179+
return 0, err
180+
}
181+
return uint32(res), nil
182+
}
183+
184+
// formatUidGid converts uid or gid to string value.
185+
func formatUidGid(uidOrGid uint32) string {
186+
return strconv.FormatUint(uint64(uidOrGid), 10)
187+
}

0 commit comments

Comments
 (0)