security-policies/bundle/compliance/lib/common/common.rego (97 lines of code) (raw):

package compliance.lib.common import future.keywords.if import future.keywords.in # get OPA version opa_version := opa.runtime().version metadata := { "opa_version": opa_version, "policy_version": "1.0.0", } current_date := create_date_from_ns(time.now_ns()) past_date := "2021-12-25T12:43:00+00:00" create_date_from_ns(x) := time_str if { date := time.date(x) t := time.clock(x) time_str := sprintf("%d-%02d-%02dT%02d:%02d:%02d+00:00", array.concat(date, t)) } ConvertDaysToHours(duration) := result if { suffix := "d" contains(duration, suffix) days := trim_suffix(duration, suffix) result = sprintf("%dh", [to_number(days) * 24]) } else := duration # set the rule result calculate_result(evaluation) := "passed" if { evaluation != false } else := "failed" # Safely evaluate evidence. In case a key is undefined, it will be defaulted. # keypaths is an object defined as {str: array} collect_evidence(resource, key_paths) := {key: evidence | some key, path in key_paths evidence := object.get(resource, path, resource) } # If value is not an array, enclose it in one ensure_array(value) := [value] if { not is_array(value) } else := value contains_key(object, key) if { object[key] } else := false contains_key_with_value(object, key, value) if { object[key] = value } else := false # checks if a value is greater or equals to a minimum value greater_or_equal(value, minimum) if { to_number(value) >= minimum } else := false # checks if duration is less than some maximum value # duration: string (https://pkg.go.dev/time#ParseDuration) duration_lt(duration, max_duration) if { duration_ns := time.parse_duration_ns(duration) max_duration_ns := time.parse_duration_ns(max_duration) duration_ns < max_duration_ns } else := false # checks if duration is less than some maximum value # duration: string (https://pkg.go.dev/time#ParseDuration) duration_lte(duration, max_duration) if { duration_ns := time.parse_duration_ns(duration) max_duration_ns := time.parse_duration_ns(max_duration) duration_ns <= max_duration_ns } else := false # checks if duration is greater than some minimum value # duration: string (https://pkg.go.dev/time#ParseDuration) duration_gt(duration, min_duration) if { duration_ns := time.parse_duration_ns(duration) min_duration_ns := time.parse_duration_ns(min_duration) duration_ns > min_duration_ns } else := false # checks if duration is greater or equal to some minimum value # duration: string (https://pkg.go.dev/time#ParseDuration) duration_gte(duration, min_duration) if { duration_ns := time.parse_duration_ns(duration) min_duration_ns := time.parse_duration_ns(min_duration) duration_ns >= min_duration_ns } else := false # The function determines whether the given date occurs within the provided time period. # date: time in nanoseconds date_within_duration(date, duration) if { now = time.now_ns() duration_ns := time.parse_duration_ns(duration) date > now - duration_ns } else := false ranges_smaller_than(ranges, value) if { range := ranges[_] range < value } ranges_gte(ranges, value) if { not ranges_smaller_than(ranges, value) } generate_result(evaluation, evidence, expected) := { "evaluation": evaluation, "evidence": evidence, "expected": expected, } generate_result_without_expected(evaluation, evidence) := { "evaluation": evaluation, "evidence": evidence, }