github.hscsec.cn/openshift/source-to-image@v1.2.0/pkg/util/user/rangelist.go (about)

     1  package user
     2  
     3  import (
     4  	"strconv"
     5  	"strings"
     6  )
     7  
     8  // RangeList is a list of user ranges
     9  type RangeList []*Range
    10  
    11  // ParseRangeList parses a string that contains a comma-separated list of ranges
    12  func ParseRangeList(str string) (*RangeList, error) {
    13  	rl := RangeList{}
    14  	if len(str) == 0 {
    15  		return &rl, nil
    16  	}
    17  	parts := strings.Split(str, ",")
    18  	for _, p := range parts {
    19  		r, err := ParseRange(p)
    20  		if err != nil {
    21  			return nil, err
    22  		}
    23  		rl = append(rl, r)
    24  	}
    25  	return &rl, nil
    26  }
    27  
    28  // Empty returns true if the RangeList is empty
    29  func (l *RangeList) Empty() bool {
    30  	if len(*l) == 0 {
    31  		return true
    32  	}
    33  	for _, r := range *l {
    34  		if !r.Empty() {
    35  			return false
    36  		}
    37  	}
    38  	return true
    39  }
    40  
    41  // Contains returns true if the uid is contained by any range in the RangeList
    42  func (l *RangeList) Contains(uid int) bool {
    43  	for _, r := range *l {
    44  		if r.Contains(uid) {
    45  			return true
    46  		}
    47  	}
    48  	return false
    49  }
    50  
    51  // Type returns the type of a RangeList object
    52  func (l *RangeList) Type() string {
    53  	return "user.RangeList"
    54  }
    55  
    56  // Set sets the value of a RangeList object
    57  func (l *RangeList) Set(value string) error {
    58  	newRangeList, err := ParseRangeList(value)
    59  	if err != nil {
    60  		return err
    61  	}
    62  	*l = *newRangeList
    63  	return nil
    64  }
    65  
    66  // String returns a parseable string representation of a RangeList
    67  func (l *RangeList) String() string {
    68  	rangeStrings := []string{}
    69  	for _, r := range *l {
    70  		rangeStrings = append(rangeStrings, r.String())
    71  	}
    72  	return strings.Join(rangeStrings, ",")
    73  }
    74  
    75  // IsUserAllowed checks that the given user is numeric and is
    76  // contained by the given RangeList.  Returns true if
    77  // allowed is nil or empty.
    78  func IsUserAllowed(user string, allowed *RangeList) bool {
    79  	if allowed == nil || allowed.Empty() {
    80  		return true
    81  	}
    82  	uid, err := strconv.Atoi(user)
    83  	if err != nil {
    84  		return false
    85  	}
    86  	return allowed.Contains(uid)
    87  }