|
Lines 21-32
Link Here
|
| 21 |
#include <config.h> |
21 |
#include <config.h> |
|
|
22 |
#include <GeoIP.h> |
| 23 |
#include <GeoIPCity.h> |
| 22 |
#include <isc/mem.h> |
24 |
#include <isc/mem.h> |
| 23 |
#include <isc/string.h> |
25 |
#include <isc/string.h> |
| 24 |
#include <isc/util.h> |
26 |
#include <isc/util.h> |
| 25 |
#include <dns/acl.h> |
27 |
#include <dns/acl.h> |
|
|
28 |
static GeoIP *geoip = NULL; |
| 29 |
|
| 26 |
isc_result_t |
30 |
isc_result_t |
| 27 |
dns_acl_create(isc_mem_t *mctx, int n, dns_acl_t **target) { |
31 |
dns_acl_create(isc_mem_t *mctx, int n, dns_acl_t **target) { |
| 28 |
isc_result_t result; |
32 |
isc_result_t result; |
|
Lines 208-214
Link Here
|
| 208 |
e->u.ip_prefix.prefixlen)) |
212 |
e->u.ip_prefix.prefixlen)) |
| 209 |
goto matched; |
213 |
goto matched; |
| 210 |
break; |
214 |
break; |
| 211 |
|
215 |
|
|
|
216 |
case dns_aclelementtype_ipregion: |
| 217 |
/* We only match V4 addresses */ |
| 218 |
if (reqaddr->family == AF_INET) { |
| 219 |
/* Region match */ |
| 220 |
|
| 221 |
if (NULL == geoip) { |
| 222 |
geoip = GeoIP_new(GEOIP_MEMORY_CACHE); |
| 223 |
} |
| 224 |
if (NULL != geoip) { |
| 225 |
GeoIPRecord * value; |
| 226 |
|
| 227 |
value = GeoIP_record_by_addr(geoip,inet_ntoa(reqaddr->type.in)); |
| 228 |
if ((NULL != value) && (NULL != value->region) && (2 == strlen(value->region))) { |
| 229 |
if ((e->u.region[0] == value->region[0]) && (e->u.region[1] == value->region[1])) { |
| 230 |
goto matched; |
| 231 |
} |
| 232 |
} |
| 233 |
} |
| 234 |
} |
| 235 |
break; |
| 236 |
|
| 212 |
case dns_aclelementtype_keyname: |
237 |
case dns_aclelementtype_keyname: |
| 213 |
if (reqsigner != NULL && |
238 |
if (reqsigner != NULL && |
| 214 |
dns_name_equal(reqsigner, &e->u.keyname)) |
239 |
dns_name_equal(reqsigner, &e->u.keyname)) |