func getGroupIds()

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)
	}
}