@@ -151,6 +151,7 @@ struct rdns_resolver { | |||
bool async_binded; | |||
bool initialized; | |||
bool enable_dnssec; | |||
int flags; | |||
ref_entry_t ref; | |||
}; | |||
@@ -105,21 +105,25 @@ rdns_format_dns_name (struct rdns_resolver *resolver, const char *in, | |||
} | |||
/* Check for non-ascii characters */ | |||
while (p != end) { | |||
if (*p >= 0x80) { | |||
need_encode = true; | |||
} | |||
else if (*p == '.') { | |||
labels ++; | |||
if (!(resolver->flags & RDNS_RESOLVER_NOIDN)) { | |||
while (p != end) { | |||
if (*p >= 0x80) { | |||
need_encode = true; | |||
} | |||
else if (*p == '.') { | |||
labels++; | |||
} | |||
p++; | |||
} | |||
p ++; | |||
} | |||
if (!need_encode) { | |||
*out = malloc (inlen + 1); | |||
if (*out == NULL) { | |||
return false; | |||
} | |||
o = *out; | |||
memcpy (o, in, inlen); | |||
o[inlen] = '\0'; |
@@ -233,10 +233,15 @@ struct rdns_request_name { | |||
* RDNS API | |||
*/ | |||
enum rdns_resolver_flags { | |||
RDNS_RESOLVER_DEFAULT, | |||
RDNS_RESOLVER_NOIDN = (1u << 0u), | |||
}; | |||
/** | |||
* Create DNS resolver structure | |||
*/ | |||
struct rdns_resolver *rdns_resolver_new (void); | |||
struct rdns_resolver *rdns_resolver_new (int flags); | |||
/** | |||
* Bind resolver to specified async context |
@@ -1049,18 +1049,19 @@ rdns_resolver_free (struct rdns_resolver *resolver) | |||
struct rdns_resolver * | |||
rdns_resolver_new (void) | |||
rdns_resolver_new (int flags) | |||
{ | |||
struct rdns_resolver *new; | |||
struct rdns_resolver *new_resolver; | |||
new = calloc (1, sizeof (struct rdns_resolver)); | |||
new_resolver = calloc (1, sizeof (struct rdns_resolver)); | |||
REF_INIT_RETAIN (new, rdns_resolver_free); | |||
REF_INIT_RETAIN (new_resolver, rdns_resolver_free); | |||
new->logger = rdns_logger_internal; | |||
new->log_data = new; | |||
new_resolver->logger = rdns_logger_internal; | |||
new_resolver->log_data = new_resolver; | |||
new_resolver->flags = flags; | |||
return new; | |||
return new_resolver; | |||
} | |||
void |
@@ -884,7 +884,8 @@ rspamd_dns_resolver_init (rspamd_logger_t *logger, | |||
dns_resolver->max_retransmits = 2; | |||
} | |||
dns_resolver->r = rdns_resolver_new (); | |||
/* IDN translation is performed in Rspamd now */ | |||
dns_resolver->r = rdns_resolver_new (RDNS_RESOLVER_NOIDN); | |||
UErrorCode uc_err = U_ZERO_ERROR; | |||