diff --git a/chain.go b/chain.go index 3a51d79..08779a7 100644 --- a/chain.go +++ b/chain.go @@ -56,49 +56,31 @@ const ( ObjectActor ) -// TODO @fyrchik: replace string with int-like type. -type ConditionType string +type ConditionType byte // TODO @fyrchik: reduce the number of conditions. // Everything from here should be expressable, but we do not need them all. // https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_elements_condition_operators.html const ( // String condition operators. - CondStringEquals ConditionType = "StringEquals" - CondStringNotEquals ConditionType = "StringNotEquals" - CondStringEqualsIgnoreCase ConditionType = "StringEqualsIgnoreCase" - CondStringNotEqualsIgnoreCase ConditionType = "StringNotEqualsIgnoreCase" - CondStringLike ConditionType = "StringLike" - CondStringNotLike ConditionType = "StringNotLike" + CondStringEquals ConditionType = iota + CondStringNotEquals + CondStringEqualsIgnoreCase + CondStringNotEqualsIgnoreCase + CondStringLike + CondStringNotLike + CondStringLessThan + CondStringLessThanEquals + CondStringGreaterThan + CondStringGreaterThanEquals // Numeric condition operators. - CondNumericEquals ConditionType = "NumericEquals" - CondNumericNotEquals ConditionType = "NumericNotEquals" - CondNumericLessThan ConditionType = "NumericLessThan" - CondNumericLessThanEquals ConditionType = "NumericLessThanEquals" - CondNumericGreaterThan ConditionType = "NumericGreaterThan" - CondNumericGreaterThanEquals ConditionType = "NumericGreaterThanEquals" - - // Date condition operators. - CondDateEquals ConditionType = "DateEquals" - CondDateNotEquals ConditionType = "DateNotEquals" - CondDateLessThan ConditionType = "DateLessThan" - CondDateLessThanEquals ConditionType = "DateLessThanEquals" - CondDateGreaterThan ConditionType = "DateGreaterThan" - CondDateGreaterThanEquals ConditionType = "DateGreaterThanEquals" - - // Bolean condition operators. - CondBool ConditionType = "Bool" - - // IP address condition operators. - CondIPAddress ConditionType = "IpAddress" - CondNotIPAddress ConditionType = "NotIpAddress" - - // ARN condition operators. - CondArnEquals ConditionType = "ArnEquals" - CondArnLike ConditionType = "ArnLike" - CondArnNotEquals ConditionType = "ArnNotEquals" - CondArnNotLike ConditionType = "ArnNotLike" + CondNumericEquals + CondNumericNotEquals + CondNumericLessThan + CondNumericLessThanEquals + CondNumericGreaterThan + CondNumericGreaterThanEquals ) func (c *Condition) Match(req Request) bool { @@ -127,6 +109,14 @@ func (c *Condition) Match(req Request) bool { return globMatch(val, c.Value) case CondStringNotLike: return !globMatch(val, c.Value) + case CondStringLessThan: + return val < c.Value + case CondStringLessThanEquals: + return val <= c.Value + case CondStringGreaterThan: + return val > c.Value + case CondStringGreaterThanEquals: + return val >= c.Value } }