Hostname suppport added master
authorJozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Mon, 28 Apr 2014 07:53:49 +0000 (09:53 +0200)
committerJozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Mon, 28 Apr 2014 07:53:49 +0000 (09:53 +0200)
Hostnames can be used besides IP addresses in policies.

cf.d/2-policy.cf
essence

index 7429d4a..4eb8c70 100644 (file)
@@ -13,3 +13,8 @@ policy = smtp server
        IP = 192.168.100.3
        service = smtp, smtps
        client = any
+
+policy = client
+       IP = 192.168.200.0/24
+       client = http
+               allow = www.google.com
diff --git a/essence b/essence
index d235acb..4f0dd19 100755 (executable)
--- a/essence
+++ b/essence
@@ -523,6 +523,20 @@ sub valid_ip_anynetwork {
     return [ @net ];
 }
 
+sub resolve {
+    my $name = shift;
+    my @ip;
+
+    open(RESOLVE, "host $name|") or parser_error("Cannot run 'host $name': $!");
+    while (<RESOLVE>) {
+       if (/ has( IPv6)? address (\S+)/) {
+           push(@ip, $2);
+       }
+    }
+    close(RESOLVE);
+    return @ip;
+}
+
 #
 # Input value must be a list of IPv4/IPv6 address patterns
 # including any valued IP address patterns
@@ -532,7 +546,7 @@ sub valid_ip_anynetwork {
 sub valid_ip_anynet {
     my($name) = shift;
     my($value) = shift;
-    my(@ip, $ip, $t, %sub);
+    my(@ip, $ip, $t, %sub, @res);
 
     %sub = ('0/0' => '0.0.0.0/0',
            '::' => '::/0');
@@ -540,11 +554,14 @@ sub valid_ip_anynet {
     @ip = split(/[\s,]+/, $value);
     foreach $ip (@ip) {
        $ip = exists $sub{$ip} ? $sub{$ip} : $ip;
-       parser_error("Invalid IP address/CIDR '$ip'")
-           unless is_ipaddr($ip);
+       if (is_ipaddr($ip)) {
+           push(@res, $ip);
+       } else {
+           push(@res, resolve($ip));
+       }
     }
 
-    return [ @ip ];
+    return [ @res ];
 }
 
 #
@@ -555,7 +572,7 @@ sub valid_ip_anynet {
 sub valid_ip {
     my($name) = shift;
     my($value) = shift;
-    my(@ip, $ip, $t, %sub);
+    my(@ip, $ip, $t, %sub, @res);
 
     %sub = ('0/0' => '0.0.0.0/0',
            '::' => '::/0');
@@ -566,11 +583,14 @@ sub valid_ip {
        parser_error("Any valued IP address pattern " .
                     "cannot be specified")
            if is_anynet($ip);
-       parser_error("Invalid IP address/CIDR '$ip'")
-           unless is_ipaddr($ip);
+       if (is_ipaddr($ip)) {
+           push(@res, $ip);
+       } else {
+           push(@res, resolve($ip));
+       }
     }
 
-    return [ @ip ];
+    return [ @res ];
 }
 
 #
@@ -3790,7 +3810,9 @@ networks.
 =item B<IP => I<IP[/CIDR]> [, ... ]
 
 The IP(v4/v6) address(es) for which the policy is defined.
-IPv4 and IPv6 addresses can freely be mixed.
+IPv4 and IPv6 addresses can freely be mixed and hostnames can
+be used as well. Hostnames are resolved at evaluating the
+configuration file and substituted with the resolved IP addresses.
 
 =item B<source => I<setname> [, ... ]
 
@@ -3811,7 +3833,9 @@ Policy setting for the given protocol(s): for which IP addresses
 the services are allowed or denied. If there are only B<deny>
 policy settings, then for anybody else the service is allowed.
 If there are only B<allow> (or mixed B<allow>, B<deny>) policy
-settings, then for anybody else the service is denied.
+settings, then for anybody else the service is denied. Hostnames are
+resolved at evaluating the configuration file and substituted with
+the resolved IP addresses.
 
 =back
 
@@ -3829,8 +3853,8 @@ Policy setting for the given protocol(s): which IP addresses may be
 accessed as servers for the given services. If there are only B<deny>
 policy settings, then to anybody else the service is allowed.
 If there are only B<allow> (or mixed B<allow>, B<deny>) policy
-settings, then to anybody else the service is denied.
-
+settings, then to anybody else the service is denied. Hostnames are resolved at
+evaluating the configuration file and substituted with the resolved IP addresses.
 
 =back