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 }