static int register_aor(pjsip_rx_data *rdata, struct ast_sip_endpoint *endpoint, struct ast_sip_aor *aor, const char *aor_name) { int res; struct ao2_container *contacts = NULL; ao2_lock(aor); contacts = ast_sip_location_retrieve_aor_contacts_nolock(aor); if (!contacts) { ao2_unlock(aor); return PJ_TRUE; } res = register_aor_core(rdata, endpoint, aor, aor_name, contacts); ao2_cleanup(contacts); ao2_unlock(aor); return res; }
static int register_aor(pjsip_rx_data *rdata, struct ast_sip_endpoint *endpoint, struct ast_sip_aor *aor, const char *aor_name) { struct aor_core_response response = { .code = 500, }; struct ao2_container *contacts = NULL; ao2_lock(aor); contacts = ast_sip_location_retrieve_aor_contacts_nolock(aor); if (!contacts) { ao2_unlock(aor); pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata, response.code, NULL, NULL, NULL); return PJ_TRUE; } register_aor_core(rdata, endpoint, aor, aor_name, contacts, &response); ao2_cleanup(contacts); ao2_unlock(aor); /* Now send the REGISTER response to the peer */ if (response.tdata) { ast_sip_send_stateful_response(rdata, response.tdata, endpoint); } else { pjsip_endpt_respond_stateless(ast_sip_get_pjsip_endpoint(), rdata, response.code, NULL, NULL, NULL); } return PJ_TRUE; } static int match_aor(const char *aor_name, const char *id) { if (ast_strlen_zero(aor_name)) { return 0; } if (!strcmp(aor_name, id)) { ast_debug(3, "Matched id '%s' to aor '%s'\n", id, aor_name); return 1; } return 0; } static char *find_aor_name(const char *username, const char *domain, const char *aors) { char *configured_aors; char *aors_buf; char *aor_name; char *id_domain; struct ast_sip_domain_alias *alias; id_domain = ast_alloca(strlen(username) + strlen(domain) + 2); sprintf(id_domain, "%s@%s", username, domain); aors_buf = ast_strdupa(aors); /* Look for exact match on username@domain */ configured_aors = aors_buf; while ((aor_name = ast_strip(strsep(&configured_aors, ",")))) { if (match_aor(aor_name, id_domain)) { return ast_strdup(aor_name); } } /* If there's a domain alias, look for exact match on username@domain_alias */ alias = ast_sorcery_retrieve_by_id(ast_sip_get_sorcery(), "domain_alias", domain); if (alias) { char *id_domain_alias = ast_alloca(strlen(username) + strlen(alias->domain) + 2); sprintf(id_domain, "%s@%s", username, alias->domain); ao2_cleanup(alias); configured_aors = strcpy(aors_buf, aors);/* Safe */ while ((aor_name = ast_strip(strsep(&configured_aors, ",")))) { if (match_aor(aor_name, id_domain_alias)) { return ast_strdup(aor_name); } } } if (ast_strlen_zero(username)) { /* No username, no match */ return NULL; } /* Look for exact match on username only */ configured_aors = strcpy(aors_buf, aors);/* Safe */ while ((aor_name = ast_strip(strsep(&configured_aors, ",")))) { if (match_aor(aor_name, username)) { return ast_strdup(aor_name); } } return NULL; }