aboutsummaryrefslogtreecommitdiffstats
path: root/test/security/k8s/src/check/validators/master/args/args.go
blob: 43f2a702cdc601f30d6f91f3027fccebf1285fe2 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package args

import (
	"strconv"
	"strings"
)

const (
	portLowest  = 1
	portHighest = 65536
)

// HasSingleFlagArgument checks whether selected flag was used once and has requested argument.
func HasSingleFlagArgument(flag string, argument string, params []string) bool {
	found := filterFlags(params, flag)
	if len(found) != 1 {
		return false
	}

	_, value := splitKV(found[0], "=")
	if value != argument {
		return false
	}
	return true
}

// HasFlagArgumentIncluded checks whether selected flag includes requested argument.
func HasFlagArgumentIncluded(flag string, argument string, params []string) bool {
	found := filterFlags(params, flag)
	if len(found) != 1 {
		return false
	}

	_, values := splitKV(found[0], "=")
	for _, v := range strings.Split(values, ",") {
		if v == argument {
			return true
		}
	}
	return false
}

// HasSingleFlagNonemptyArgument checks whether selected flag was used once and has non-empty argument.
func HasSingleFlagNonemptyArgument(flag string, params []string) bool {
	found := filterFlags(params, flag)
	if len(found) != 1 {
		return false
	}

	_, value := splitKV(found[0], "=")
	if value == "" {
		return false
	}
	return true
}

// HasSingleFlagValidPort checks whether selected flag has valid port as an argument in given command.
func HasSingleFlagValidPort(flag string, params []string) bool {
	found := filterFlags(params, flag)
	if len(found) != 1 {
		return false
	}

	_, value := splitKV(found[0], "=")
	port, err := strconv.Atoi(value) // what about empty parameter?
	if err != nil {
		return false
	}
	if port < portLowest || port > portHighest {
		return false
	}
	return true
}

// HasSingleFlagValidTimeout checks whether selected flag has valid timeout as an argument in given command.
func HasSingleFlagValidTimeout(flag string, min int, max int, params []string) bool {
	found := filterFlags(params, flag)
	if len(found) != 1 {
		return false
	}

	_, value := splitKV(found[0], "=")
	timeout, err := strconv.Atoi(value) // what about empty parameter?
	if err != nil {
		return false
	}
	if timeout < min || timeout > max {
		return false
	}
	return true
}

// HasSingleFlagRecommendedNumericArgument checks whether selected flag was used once and has
// an argument that is greater or equal than the recommended value for given command.
func HasSingleFlagRecommendedNumericArgument(flag string, recommendation int, params []string) bool {
	found := filterFlags(params, flag)
	if len(found) != 1 {
		return false
	}

	_, value := splitKV(found[0], "=")
	arg, err := strconv.Atoi(value) // what about empty parameter?
	if err != nil {
		return false
	}
	if arg < recommendation {
		return false
	}
	return true
}

// filterFlags returns all occurrences of selected flag.
func filterFlags(strs []string, flag string) []string {
	var filtered []string
	for _, str := range strs {
		if strings.HasPrefix(str, flag) {
			filtered = append(filtered, str)
		}
	}
	return filtered
}

// splitKV splits key and value (after first occurrence of separator).
func splitKV(s, sep string) (string, string) {
	ret := strings.SplitN(s, sep, 2)
	return ret[0], ret[1]
}