[sr-dev] [PATCH] modules/sca: use Call-Info for canonical AoR
Andrew Mortensen
admorten at isc.upenn.edu
Fri Oct 11 15:35:43 CEST 2013
Hi Timo. Thanks, this looks good. As long as your testing goes well, I'm happy to see it committed.
andrew
On Oct 11, 2013, at 6:30 AM, Timo Teräs <timo.teras at iki.fi>
wrote:
> RFC3261 8.1.1.2 states that To header "may or may not be the ultimate
> recipient of the request", and 8.1.1.3 states that From header is
> "possibly the user's address-of-record". So either of them cannot be
> fully trusted.
>
> This was already noted and fixed partially in commit 1ef4587612806a94
> ("modules/sca: reconcile Contact and From URIs in ACK callback").
>
> But similar issues happen when using ENUM and/or calling using local
> alias (numbers only, or local forward) and the destination is in another
> SIP domain. To-header contains the initial domain, and not the AoR domain.
> When handling response to such INVITE a sane way to determine correct
> AoR is to inspect the Call-Info header's Application Server URI.
>
> Thus this changes AoR canonicalization to happens as follow:
> 1. User portion is taken from Contact header if present, otherwise
> from the applicable From / To header.
> 2. Domain/port part is taken from Call-Info header if present, and
> otherwise from the applicable From / To header.
> ---
> This has not fully tested, but this seems to be the root case why SCA does
> not on certain inter-domain calls that I get. I'd like to get review comments,
> and possible other fix ideas. I'll let you know how the testing goes, and
> if looks OK to you can push this to master and relevant stable branches.
>
> modules/sca/sca_util.c | 51 +++++++++++++++++++++++++++-----------------------
> 1 file changed, 28 insertions(+), 23 deletions(-)
>
> diff --git a/modules/sca/sca_util.c b/modules/sca/sca_util.c
> index 143ac47..e209cc0 100644
> --- a/modules/sca/sca_util.c
> +++ b/modules/sca/sca_util.c
> @@ -26,6 +26,7 @@
> #include <assert.h>
>
> #include "sca_util.h"
> +#include "sca_call_info.h"
>
> #include "../../parser/sdp/sdp.h"
>
> @@ -343,9 +344,13 @@ sca_aor_create_from_info( str *aor, uri_type type, str *user, str *domain,
> sca_create_canonical_aor_for_ua( sip_msg_t *msg, str *c_aor, int ua_opts )
> {
> struct to_body *tf = NULL;
> - sip_uri_t c_uri;
> - str tf_aor = STR_NULL;
> + str user_portion;
> + str domain_portion;
> + str port_portion = STR_NULL;
> str contact_uri = STR_NULL;
> + sip_uri_t c_uri;
> + sca_call_info call_info;
> + hdr_field_t *call_info_hdr;
> int rc = -1;
>
> assert( msg != NULL );
> @@ -373,12 +378,6 @@ sca_create_canonical_aor_for_ua( sip_msg_t *msg, str *c_aor, int ua_opts )
> }
> }
>
> - if ( sca_uri_extract_aor( &tf->uri, &tf_aor ) < 0 ) {
> - LM_ERR( "sca_create_canonical_aor: failed to extract AoR from "
> - "URI <%.*s>", STR_FMT( &tf->uri ));
> - goto done;
> - }
> -
> memset( &c_uri, 0, sizeof( sip_uri_t ));
> if (( rc = sca_get_msg_contact_uri( msg, &contact_uri )) < 0 ) {
> LM_ERR( "sca_create_canonical_aor: failed to get contact URI from "
> @@ -394,22 +393,28 @@ sca_create_canonical_aor_for_ua( sip_msg_t *msg, str *c_aor, int ua_opts )
> }
> }
>
> - if ( SCA_STR_EMPTY( &c_uri.user ) ||
> - SCA_STR_EQ( &c_uri.user, &tf->parsed_uri.user )) {
> - /* empty contact header or Contact user matches To/From AoR */
> - c_aor->s = (char *)pkg_malloc( tf_aor.len );
> - c_aor->len = tf_aor.len;
> - memcpy( c_aor->s, tf_aor.s, tf_aor.len );
> + /* Prefer Contact header user, fallback to To/From */
> + if ( SCA_STR_EMPTY( &c_uri.user ) )
> + user_portion = tf->parsed_uri.user;
> + else
> + user_portion = c_uri.user;
> +
> + memset( &call_info, 0, sizeof( sca_call_info ));
> + call_info_hdr = sca_call_info_header_find( msg->headers );
> + if ( !SCA_HEADER_EMPTY( call_info_hdr ) &&
> + sca_call_info_body_parse( &call_info_hdr->body, &call_info ) >= 0 ) {
> + /* Call-Info present, use the server name as AoR domain */
> + domain_portion = call_info.sca_uri;
> } else {
> - /* Contact user and To/From user mismatch */
> - if ( sca_aor_create_from_info( c_aor, c_uri.type,
> - &c_uri.user, &tf->parsed_uri.host,
> - &tf->parsed_uri.port ) < 0 ) {
> - LM_ERR( "sca_create_canonical_aor: failed to create AoR from "
> - "Contact <%.*s> and URI <%.*s>",
> - STR_FMT( &contact_uri ), STR_FMT( &tf_aor ));
> - goto done;
> - }
> + /* Use To/From domain */
> + domain_portion = tf->parsed_uri.host;
> + port_portion = tf->parsed_uri.port;
> + }
> +
> + if ( sca_aor_create_from_info( c_aor, c_uri.type, &user_portion, &domain_portion, &port_portion ) < 0 ) {
> + LM_ERR( "sca_create_canonical_aor: failed to create canonical AoR "
> + "user: <%.*s>, domain: <%.*s>", STR_FMT( &user_portion ), STR_FMT( &domain_portion ));
> + goto done;
> }
>
> rc = 1;
> --
> 1.8.4
>
More information about the sr-dev
mailing list