// IP provides a CEL function library extension of IP address parsing functions. // // ip // // Converts a string to an IP address or results in an error if the string is not a valid IP address. // The IP address must be an IPv4 or IPv6 address. // IPv4-mapped IPv6 addresses (e.g. ::ffff:1.2.3.4) are not allowed. // IP addresses with zones (e.g. fe80::1%eth0) are not allowed. // Leading zeros in IPv4 address octets are not allowed. // // ip(<string>) <IPAddr> // // Examples: // // ip('127.0.0.1') // returns an IPv4 address // ip('::1') // returns an IPv6 address // ip('127.0.0.256') // error // ip(':::1') // error // // isIP // // Returns true if a string is a valid IP address. // The IP address must be an IPv4 or IPv6 address. // IPv4-mapped IPv6 addresses (e.g. ::ffff:1.2.3.4) are not allowed. // IP addresses with zones (e.g. fe80::1%eth0) are not allowed. // Leading zeros in IPv4 address octets are not allowed. // // isIP(<string>) <bool> // // Examples: // // isIP('127.0.0.1') // returns true // isIP('::1') // returns true // isIP('127.0.0.256') // returns false // isIP(':::1') // returns false // // ip.isCanonical // // Returns true if the IP address is in its canonical form. // There is exactly one canonical form for every IP address, so fields containing // IPs in canonical form can just be treated as strings when checking for equality or uniqueness. // // ip.isCanonical(<string>) <bool> // // Examples: // // ip.isCanonical('127.0.0.1') // returns true; all valid IPv4 addresses are canonical // ip.isCanonical('2001:db8::abcd') // returns true // ip.isCanonical('2001:DB8::ABCD') // returns false // ip.isCanonical('2001:db8::0:0:0:abcd') // returns false // // family / isUnspecified / isLoopback / isLinkLocalMulticast / isLinkLocalUnicast / isGlobalUnicast // // - family: returns the IP addresses' family (IPv4 or IPv6) as an integer, either '4' or '6'. // // - isUnspecified: returns true if the IP address is the unspecified address. // Either the IPv4 address "0.0.0.0" or the IPv6 address "::". // // - isLoopback: returns true if the IP address is the loopback address. // Either an IPv4 address with a value of 127.x.x.x or an IPv6 address with a value of ::1. // // - isLinkLocalMulticast: returns true if the IP address is a link-local multicast address. // Either an IPv4 address with a value of 224.0.0.x or an IPv6 address in the network ff00::/8. // // - isLinkLocalUnicast: returns true if the IP address is a link-local unicast address. // Either an IPv4 address with a value of 169.254.x.x or an IPv6 address in the network fe80::/10. // // - isGlobalUnicast: returns true if the IP address is a global unicast address. // Either an IPv4 address that is not zero or 255.255.255.255 or an IPv6 address that is not a link-local unicast, loopback or multicast address. // // Examples: // // ip('127.0.0.1').family() // returns '4” // ip('::1').family() // returns '6' // ip('127.0.0.1').family() == 4 // returns true // ip('::1').family() == 6 // returns true // ip('0.0.0.0').isUnspecified() // returns true // ip('127.0.0.1').isUnspecified() // returns false // ip('::').isUnspecified() // returns true // ip('::1').isUnspecified() // returns false // ip('127.0.0.1').isLoopback() // returns true // ip('192.168.0.1').isLoopback() // returns false // ip('::1').isLoopback() // returns true // ip('2001:db8::abcd').isLoopback() // returns false // ip('224.0.0.1').isLinkLocalMulticast() // returns true // ip('224.0.1.1').isLinkLocalMulticast() // returns false // ip('ff02::1').isLinkLocalMulticast() // returns true // ip('fd00::1').isLinkLocalMulticast() // returns false // ip('169.254.169.254').isLinkLocalUnicast() // returns true // ip('192.168.0.1').isLinkLocalUnicast() // returns false // ip('fe80::1').isLinkLocalUnicast() // returns true // ip('fd80::1').isLinkLocalUnicast() // returns false // ip('192.168.0.1').isGlobalUnicast() // returns true // ip('255.255.255.255').isGlobalUnicast() // returns false // ip('2001:db8::abcd').isGlobalUnicast() // returns true // ip('ff00::1').isGlobalUnicast() // returns false func IP() cel.EnvOption { … } var ipLib … type ip … func (*ip) LibraryName() string { … } func (*ip) declarations() map[string][]cel.FunctionOpt { … } func (*ip) Types() []*cel.Type { … } var ipLibraryDecls … func (*ip) CompileOptions() []cel.EnvOption { … } func (*ip) ProgramOptions() []cel.ProgramOption { … } func stringToIP(arg ref.Val) ref.Val { … } func ipToString(arg ref.Val) ref.Val { … } func family(arg ref.Val) ref.Val { … } func ipIsCanonical(arg ref.Val) ref.Val { … } func isIP(arg ref.Val) ref.Val { … } func isUnspecified(arg ref.Val) ref.Val { … } func isLoopback(arg ref.Val) ref.Val { … } func isLinkLocalMulticast(arg ref.Val) ref.Val { … } func isLinkLocalUnicast(arg ref.Val) ref.Val { … } func isGlobalUnicast(arg ref.Val) ref.Val { … } // parseIPAddr parses a string into an IP address. // We use this function to parse IP addresses in the CEL library // so that we can share the common logic of rejecting IP addresses // that contain zones or are IPv4-mapped IPv6 addresses. func parseIPAddr(raw string) (netip.Addr, error) { … }