in internal/util/user/userutil_linux.go [39:89]
func getGroupIds(user, filePath string) ([]int, error) {
file, err := os.Open(filePath)
if err != nil {
log.Printf("E! Failed to open group file: %v", err)
return nil, err
}
defer file.Close()
reader := bufio.NewReader(file)
groupIds := []int{}
for {
var wholeLine []byte
for {
line, isPrefix, err := reader.ReadLine()
if err != nil {
// EOF reached
if err == io.EOF {
return groupIds, nil
}
return nil, err
}
// Whole line was able to fit in single buffer
if !isPrefix && len(wholeLine) == 0 {
wholeLine = line
break
}
wholeLine = append(wholeLine, line...)
// Last fragment of line read
if !isPrefix {
break
}
}
wholeLine = bytes.TrimSpace(wholeLine)
// Not empty, not a comment, and has enough parts
if len(wholeLine) == 0 || wholeLine[0] == '#' || bytes.Count(wholeLine, []byte{':'}) < 3 {
continue
}
parts := strings.SplitN(string(wholeLine), ":", 4)
users := strings.Split(parts[3], ",")
if len(users) == 0 || !containsUser(users, user) {
continue
}
groupId, err := strconv.Atoi(parts[2])
if err != nil {
return nil, err
}
groupIds = append(groupIds, groupId)
}
}