Lines 21-32
Link Here
|
21 |
|
21 |
|
22 |
#include <config.h> |
22 |
#include <config.h> |
23 |
|
23 |
|
|
|
24 |
#include <GeoIP.h> |
25 |
#include <GeoIPCity.h> |
24 |
#include <isc/mem.h> |
26 |
#include <isc/mem.h> |
25 |
#include <isc/string.h> |
27 |
#include <isc/string.h> |
26 |
#include <isc/util.h> |
28 |
#include <isc/util.h> |
27 |
|
29 |
|
28 |
#include <dns/acl.h> |
30 |
#include <dns/acl.h> |
29 |
|
31 |
|
|
|
32 |
static GeoIP *geoip = NULL; |
33 |
|
30 |
isc_result_t |
34 |
isc_result_t |
31 |
dns_acl_create(isc_mem_t *mctx, int n, dns_acl_t **target) { |
35 |
dns_acl_create(isc_mem_t *mctx, int n, dns_acl_t **target) { |
32 |
isc_result_t result; |
36 |
isc_result_t result; |
Lines 209-214
Link Here
|
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 |
|
237 |
case dns_aclelementtype_ipcountry: |
238 |
/* We only match V4 addresses */ |
239 |
if (reqaddr->family == AF_INET) { |
240 |
/* Country match */ |
241 |
|
242 |
if (NULL == geoip) { |
243 |
geoip = GeoIP_new(GEOIP_MEMORY_CACHE); |
244 |
} |
245 |
if (NULL != geoip) { |
246 |
const char *value; |
247 |
|
248 |
value = GeoIP_country_code_by_addr(geoip,inet_ntoa(reqaddr->type.in)); |
249 |
if ((NULL != value) && (2 == strlen(value))) { |
250 |
if ((e->u.country[0] == value[0]) && (e->u.country[1] == value[1])) { |
251 |
goto matched; |
252 |
} |
253 |
} |
254 |
} |
255 |
} |
256 |
break; |
257 |
|
212 |
case dns_aclelementtype_keyname: |
258 |
case dns_aclelementtype_keyname: |
213 |
if (reqsigner != NULL && |
259 |
if (reqsigner != NULL && |
214 |
dns_name_equal(reqsigner, &e->u.keyname)) |
260 |
dns_name_equal(reqsigner, &e->u.keyname)) |