Esempio n. 1
0
int select_uri_type(str* res, select_t* s, struct sip_msg* msg)
{
	trim(res);
	if (parse_uri(res->s, res->len, &uri)<0)
		return -1;

	if (uri.type==ERROR_URI_T)
		return -1;

	uri_type_to_str(uri.type, res);
	return 0;
}
Esempio n. 2
0
    int
sca_aor_create_from_info( str *aor, uri_type type, str *user, str *domain,
	str *port )
{
    str		scheme = STR_NULL;
    int		len = 0;

    assert( aor != NULL );

    uri_type_to_str( type, &scheme );

    /* +1 for ':', +1 for '@' */
    len = scheme.len + 1 + user->len + 1 + domain->len;
    if ( !SCA_STR_EMPTY( port )) {
	/* +1 for ':' */
	len += 1 + port->len;
    }

    aor->s = (char *)pkg_malloc( len );
    if ( aor->s == NULL ) {
	LM_ERR( "sca_aor_create_from_info: pkg_malloc %d bytes failed", len );
	return( -1 );
    }

    len = 0;
    SCA_STR_COPY( aor, &scheme );
    len += scheme.len;

    *(aor->s + len) = ':';
    aor->len++;
    len++;

    SCA_STR_APPEND( aor, user );
    len += user->len;

    *(aor->s + len) = '@';
    aor->len++;
    len++;

    SCA_STR_APPEND( aor, domain );
    len += domain->len;

    if ( !SCA_STR_EMPTY( port )) {
	*(aor->s + len) = ':';
	len += 1;

	SCA_STR_APPEND( aor, port );
	len += port->len;
    }

    return( aor->len );
}
Esempio n. 3
0
int select_uri_type(str* res, select_t* s, struct sip_msg* msg)
{
	if (select_uri_p == NULL) {
		trim(res);
		if (parse_uri(res->s, res->len, &uri)<0)
			return -1;
		select_uri_p = &uri;
	}

	if (select_uri_p->type==ERROR_URI_T)
		return -1;

	uri_type_to_str(select_uri_p->type, res);
	return 0;
}
Esempio n. 4
0
static int load_uri_attrs(struct sip_msg* msg, unsigned long flags, fparam_t* fp)
{
    static char rad_msg[4096];
    struct sip_uri puri;
    str uri, did, scheme;
    UINT4 service;
    VALUE_PAIR* send, *received;

    send = NULL;
    received = NULL;

    if (get_str_fparam(&uri, msg, (fparam_t*)fp) != 0) {
	ERR("Unable to get URI\n");
	return -1;
    }

    if (parse_uri(uri.s, uri.len, &puri) < 0) {
	ERR("Error while parsing URI '%.*s'\n", uri.len, uri.s);
	return -1;
    }

    if (puri.host.len) {
	/* domain name is present */
	if (dm_get_did(&did, &puri.host) < 0) {
		DBG("Cannot lookup DID for domain %.*s, using default value\n", puri.host.len, ZSW(puri.host.s));
		did.s = DEFAULT_DID;
		did.len = sizeof(DEFAULT_DID) - 1;
	}
    } else {
	/* domain name is missing -- can be caused by tel: URI */
	DBG("There is no domain name, using default value\n");
	did.s = DEFAULT_DID;
	did.len = sizeof(DEFAULT_DID) - 1;
    }

    uri_type_to_str(puri.type, &scheme);
    service = vals[V_GET_URI_ATTRS].v;

    if (scheme.len) {
	if (!rc_avpair_add(rh, &send, ATTRID(attrs[A_SER_URI_SCHEME].v), 
			   scheme.s, scheme.len,
			   VENDOR(attrs[A_SER_URI_SCHEME].v))) {
	    ERR("Error while adding A_SER_URI_SCHEME\n");
	    goto error;
	}
    }

    if (!rc_avpair_add(rh, &send, ATTRID(attrs[A_USER_NAME].v), 
		       puri.user.s, puri.user.len,
		       VENDOR(attrs[A_USER_NAME].v))) {
	ERR("Error while adding A_USER_NAME\n");
	goto error;
    }

    if (!rc_avpair_add(rh, &send, ATTRID(attrs[A_SER_DID].v), 
		       did.s, did.len,
		       VENDOR(attrs[A_SER_DID].v))) {
	ERR("Error while adding A_SER_DID\n");
	goto error;
    }
    
    if (!rc_avpair_add(rh, &send, ATTRID(attrs[A_SER_SERVICE_TYPE].v), 
		       &vals[V_GET_URI_ATTRS].v, -1,
		       VENDOR(attrs[A_SER_SERVICE_TYPE].v))) {
	ERR("Error adding A_SERVICE_TYPE\n");
	goto error;
    }

    if (rc_auth(rh, 0, send, &received, rad_msg) != OK_RC) {
	DBG("load_uri_attrs: Failure\n");
	goto error;
    }

    DBG("load_uri_attrs: Success\n");
    rc_avpair_free(send);

    if (generate_avps(flags, received) < 0) {
	rc_avpair_free(received);
	goto error;
    }

    rc_avpair_free(received);
    return 1;

 error:
    if (send) rc_avpair_free(send);
    if (received) rc_avpair_free(send);
    return -1;
}
Esempio n. 5
0
static int load_uri_attrs(struct sip_msg* msg, unsigned long flags, fparam_t* fp)
{
    int_str name, v;
    str avp_name, avp_val;
    int i, type, n;
    db_key_t keys[3], cols[4];
    db_res_t* res;
    db_val_t kv[3], *val;
    str uri;
    struct sip_uri puri;

    keys[0] = username_column;
    keys[1] = did_column;
    keys[2] = scheme_column;
    kv[0].type = DB_STR;
    kv[0].nul = 0;
    kv[1].type = DB_STR;
    kv[1].nul = 0;
    kv[2].type = DB_STR;
    kv[2].nul = 0;

    if (get_str_fparam(&uri, msg, (fparam_t*)fp) != 0) {
	ERR("Unable to get URI\n");
	return -1;
    }

    if (parse_uri(uri.s, uri.len, &puri) < 0) {
	ERR("Error while parsing URI '%.*s'\n", uri.len, uri.s);
	return -1;
    }

    kv[0].val.str_val = puri.user;

    if (puri.host.len) {
	/* domain name is present */
	if (dm_get_did(&kv[1].val.str_val, &puri.host) < 0) {
		DBG("Cannot lookup DID for domain %.*s, using default value\n", puri.host.len, ZSW(puri.host.s));
		kv[1].val.str_val.s = DEFAULT_DID;
		kv[1].val.str_val.len = sizeof(DEFAULT_DID) - 1;
	}
    } else {
	/* domain name is missing -- can be caused by tel: URI */
	DBG("There is no domain name, using default value\n");
	kv[1].val.str_val.s = DEFAULT_DID;
	kv[1].val.str_val.len = sizeof(DEFAULT_DID) - 1;
    }

    uri_type_to_str(puri.type, &(kv[2].val.str_val));

    cols[0] = name_column;
    cols[1] = type_column;
    cols[2] = val_column;
    cols[3] = flags_column;
    
    if (db.use_table(con, uri_attrs_table) < 0) {
	ERR("Error in use_table\n");
	return -1;
    }
    
    if (db.query(con, keys, 0, kv, cols, 3, 4, 0, &res) < 0) {
	ERR("Error while quering database\n");
	return -1;
    }
    
    n = 0;
    /* AVP names from DB are always strings */
    flags |= AVP_NAME_STR;
    for(i = 0; i < res->n; i++) {
	/* reset val_str as the value could be an integer */
	flags &= ~AVP_VAL_STR;
	val = res->rows[i].values;
	
	if (val[0].nul || val[1].nul || val[3].nul) {
	    ERR("Skipping row containing NULL entries\n");
	    continue;
	}
	
	if ((val[3].val.int_val & DB_LOAD_SER) == 0) continue;
	
	n++;
	     /* Get AVP name */
	avp_name.s = (char*)val[0].val.string_val;
	avp_name.len = strlen(avp_name.s);
	name.s = avp_name;
	
	     /* Get AVP type */
	type = val[1].val.int_val;
	
	     /* Test for NULL value */
	if (val[2].nul) {
	    avp_val.s = 0;
	    avp_val.len = 0;
	} else {
	    avp_val.s = (char*)val[2].val.string_val;
	    avp_val.len = strlen(avp_val.s);
	}

	if (type == AVP_VAL_STR) {
		 /* String AVP */
	    v.s = avp_val;
	    flags |= AVP_VAL_STR;
	} else {
		 /* Integer AVP */
	    str2int(&avp_val, (unsigned*)&v.n);
	}
	
	if (add_avp(flags, name, v) < 0) {
	    ERR("Error while adding user attribute %.*s, skipping\n",
		avp_name.len, ZSW(avp_name.s));
	    continue;
	}
    }
    DBG("avp_db:load_attrs: %d user attributes found, %d loaded\n", res->n, n);
    db.free_result(con, res);
    return 1;
}