Skip to content

Commit fb43b05

Browse files
committed
address feedback on getseuserbyname
1 parent 3a28444 commit fb43b05

File tree

2 files changed

+32
-12
lines changed

2 files changed

+32
-12
lines changed

go-selinux/selinux_linux.go

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1210,28 +1210,27 @@ func getSeUserFromReader(username string, gids []string, r io.Reader, lookupGrou
12101210
lineNum++
12111211

12121212
// remove any trailing comments, then extra whitespace
1213-
parts := strings.SplitN(line, "#", 2)
1214-
line = strings.TrimSpace(parts[0])
1213+
line, _, _ = strings.Cut(line, "#")
1214+
line = strings.TrimSpace(line)
12151215
if line == "" {
12161216
continue
12171217
}
12181218

1219-
parts = strings.SplitN(line, ":", 3)
1220-
if len(parts) < 2 {
1219+
userField, rest, ok := strings.Cut(line, ":")
1220+
if !ok {
12211221
return "", "", fmt.Errorf("line %d: malformed line", lineNum)
12221222
}
1223-
userField := parts[0]
12241223
if userField == "" {
12251224
return "", "", fmt.Errorf("line %d: user_id or group_id is empty", lineNum)
12261225
}
1227-
seUserField := parts[1]
1226+
seUserField, rest, ok := strings.Cut(rest, ":")
12281227
if seUserField == "" {
12291228
return "", "", fmt.Errorf("line %d: seuser_id is empty", lineNum)
12301229
}
12311230
var levelField string
12321231
// level is optional
1233-
if len(parts) > 2 {
1234-
levelField = parts[2]
1232+
if ok {
1233+
levelField = rest
12351234
}
12361235

12371236
// we found a match, return it
@@ -1268,7 +1267,7 @@ func getSeUserFromReader(username string, gids []string, r io.Reader, lookupGrou
12681267

12691268
// getSeUserByName returns an SELinux user and MLS level that is
12701269
// mapped to a given Linux user.
1271-
func getSeUserByName(username string) (seUser string, level string, err error) {
1270+
func getSeUserByName(username string) (string, string, error) {
12721271
seUsersConf := filepath.Join(policyRoot(), "seusers")
12731272
confFile, err := os.Open(seUsersConf)
12741273
if err != nil {
@@ -1278,15 +1277,15 @@ func getSeUserByName(username string) (seUser string, level string, err error) {
12781277

12791278
usr, err := user.Lookup(username)
12801279
if err != nil {
1281-
return "", "", fmt.Errorf("failed to lookup user %q", username)
1280+
return "", "", err
12821281
}
12831282
gids, err := usr.GroupIds()
12841283
if err != nil {
1285-
return "", "", fmt.Errorf("failed to find user %q's groups", username)
1284+
return "", "", err
12861285
}
12871286
gids = append([]string{usr.Gid}, gids...)
12881287

1289-
seUser, level, err = getSeUserFromReader(username, gids, confFile, user.LookupGroup)
1288+
seUser, level, err := getSeUserFromReader(username, gids, confFile, user.LookupGroup)
12901289
if err != nil {
12911290
return "", "", fmt.Errorf("failed to parse seusers file: %w", err)
12921291
}

go-selinux/selinux_linux_test.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -691,6 +691,27 @@ user::s0
691691
bob:staff_u:s0-s15:c0.c255`,
692692
expectedErr: "line 3: seuser_id is empty",
693693
},
694+
{
695+
name: "one entry match with whitespace",
696+
username: "bob",
697+
seUserBuf: " bob:staff_u:s0 ",
698+
seUser: "staff_u",
699+
level: "s0",
700+
},
701+
{
702+
name: "one entry match with trailing comment",
703+
username: "bob",
704+
seUserBuf: "bob:staff_u:s0#comment",
705+
seUser: "staff_u",
706+
level: "s0",
707+
},
708+
{
709+
name: "one entry match with whitespace and trailing comment",
710+
username: "bob",
711+
seUserBuf: " bob:staff_u:s0 #comment ",
712+
seUser: "staff_u",
713+
level: "s0",
714+
},
694715
}
695716

696717
for _, tt := range tests {

0 commit comments

Comments
 (0)