From 2bca5b5285b60a4dca9af1def8ea52dd61b5a79c Mon Sep 17 00:00:00 2001 From: Joshua Colp Date: Tue, 31 Dec 2013 22:19:03 +0000 Subject: [PATCH] res_pjsip_endpoint_identifier_ip: Accept hostnames in the 'match' field. Hostnames specified in the 'match' field will be resolved and all addresses returned. Each address will be added to the endpoint identifier for the matching process. Reported by: Rob Thomas git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/12@404613 65c4cc65-6c06-0410-ace0-fbb531ad65f3 --- res/res_pjsip_endpoint_identifier_ip.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/res/res_pjsip_endpoint_identifier_ip.c b/res/res_pjsip_endpoint_identifier_ip.c index 34c8f2c393..d71345b199 100644 --- a/res/res_pjsip_endpoint_identifier_ip.c +++ b/res/res_pjsip_endpoint_identifier_ip.c @@ -156,13 +156,30 @@ static struct ast_sip_endpoint_identifier ip_identifier = { static int ip_identify_match_handler(const struct aco_option *opt, struct ast_variable *var, void *obj) { struct ip_identify_match *identify = obj; - int error = 0; + int num_addrs = 0, error = 0, i; + struct ast_sockaddr *addrs; - /* We deny what we actually want to match because there is an implicit permit all rule for ACLs */ - if (!(identify->matches = ast_append_ha("d", var->value, identify->matches, &error))) { + num_addrs = ast_sockaddr_resolve(&addrs, var->value, PARSE_PORT_FORBID, AST_AF_UNSPEC); + if (!num_addrs) { + ast_log(LOG_ERROR, "Address '%s' provided on ip endpoint identifier '%s' did not resolve to any address\n", + var->value, ast_sorcery_object_get_id(obj)); return -1; } + for (i = 0; i < num_addrs; ++i) { + /* We deny what we actually want to match because there is an implicit permit all rule for ACLs */ + identify->matches = ast_append_ha("d", ast_sockaddr_stringify_addr(&addrs[i]), identify->matches, &error); + + if (!identify->matches || error) { + ast_log(LOG_ERROR, "Failed to add address '%s' to ip endpoint identifier '%s'\n", + ast_sockaddr_stringify_addr(&addrs[i]), ast_sorcery_object_get_id(obj)); + error = -1; + break; + } + } + + ast_free(addrs); + return error; } -- 2.47.2