@@ -16,7 +16,7 @@ import (
16
16
17
17
type User struct {
18
18
User string
19
- Uid uint32 //nolint:revive
19
+ Uid uint32
20
20
Group string
21
21
Gid uint32
22
22
Home string
@@ -30,11 +30,9 @@ type Group struct {
30
30
var users map [string ]User
31
31
var groups map [string ]Group
32
32
33
- // regexUidGid detects valid Linux uid or gid.
34
- var regexUidGid = regexp .MustCompile ("^[0-9]+$" ) //nolint:revive
35
-
36
33
// 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.
38
36
var regexUsername = regexp .MustCompile ("^[a-z_][a-z0-9_-]*$" )
39
37
40
38
// regexPath detects valid Linux path.
@@ -53,15 +51,15 @@ func LookupUser(name string) (User, error) {
53
51
if err != nil {
54
52
return User {}, err
55
53
}
56
- uid , err := strconv . ParseUint (u .Uid , 10 , 32 )
54
+ uid , err := parseUidGid (u .Uid )
57
55
if err != nil {
58
56
return User {}, err
59
57
}
60
- gid , err := strconv . ParseUint (u .Gid , 10 , 32 )
58
+ gid , err := parseUidGid (u .Gid )
61
59
if err != nil {
62
60
return User {}, err
63
61
}
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 }
65
63
}
66
64
return users [name ], nil
67
65
}
@@ -75,18 +73,18 @@ func LookupGroup(name string) (Group, error) {
75
73
if err != nil {
76
74
return Group {}, err
77
75
}
78
- gid , err := strconv . ParseUint (g .Gid , 10 , 32 )
76
+ gid , err := parseUidGid (g .Gid )
79
77
if err != nil {
80
78
return Group {}, err
81
79
}
82
- groups [name ] = Group {Name : g .Name , Gid : uint32 ( gid ) }
80
+ groups [name ] = Group {Name : g .Name , Gid : gid }
83
81
}
84
82
return groups [name ], nil
85
83
}
86
84
87
85
const (
88
86
fallbackUser = "lima"
89
- fallbackUid = 1000 //nolint:revive
87
+ fallbackUid = 1000
90
88
fallbackGid = 1000
91
89
)
92
90
@@ -122,29 +120,29 @@ func LimaUser(warn bool) (*user.User, error) {
122
120
if err != nil {
123
121
logrus .Debug (err )
124
122
}
125
- uid , err := strconv . ParseUint (idu , 10 , 32 )
123
+ uid , err := parseUidGid (idu )
126
124
if err != nil {
127
125
uid = fallbackUid
128
126
}
129
- if ! regexUidGid . MatchString (cache .u .Uid ) {
127
+ if _ , err := parseUidGid (cache .u .Uid ); err != nil {
130
128
warning := fmt .Sprintf ("local uid %q is not a valid Linux uid (must be integer); using %d uid instead" ,
131
129
cache .u .Uid , uid )
132
130
cache .warnings = append (cache .warnings , warning )
133
- cache .u .Uid = fmt . Sprintf ( "%d" , uid )
131
+ cache .u .Uid = formatUidGid ( uid )
134
132
}
135
133
idg , err := call ([]string {"id" , "-g" })
136
134
if err != nil {
137
135
logrus .Debug (err )
138
136
}
139
- gid , err := strconv . ParseUint (idg , 10 , 32 )
137
+ gid , err := parseUidGid (idg )
140
138
if err != nil {
141
139
gid = fallbackGid
142
140
}
143
- if ! regexUidGid . MatchString (cache .u .Gid ) {
141
+ if _ , err := parseUidGid (cache .u .Gid ); err != nil {
144
142
warning := fmt .Sprintf ("local gid %q is not a valid Linux gid (must be integer); using %d gid instead" ,
145
143
cache .u .Gid , gid )
146
144
cache .warnings = append (cache .warnings , warning )
147
- cache .u .Gid = fmt . Sprintf ( "%d" , gid )
145
+ cache .u .Gid = formatUidGid ( gid )
148
146
}
149
147
home , err := call ([]string {"cygpath" , cache .u .HomeDir })
150
148
if err != nil {
@@ -173,3 +171,17 @@ func LimaUser(warn bool) (*user.User, error) {
173
171
}
174
172
return cache .u , cache .err
175
173
}
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