Exemple #1
0
static int iftime(struct ast_channel *chan, char *cmd, char *data, char *buf,
		  size_t len)
{
	struct ast_timing timing;
	char *expr;
	char *iftrue;
	char *iffalse;

	data = ast_strip_quoted(data, "\"", "\"");
	expr = strsep(&data, "?");
	iftrue = strsep(&data, ":");
	iffalse = data;

	if (ast_strlen_zero(expr) || !(iftrue || iffalse)) {
		ast_log(LOG_WARNING,
				"Syntax IFTIME(<timespec>?[<true>][:<false>])\n");
		return -1;
	}

	if (!ast_build_timing(&timing, expr)) {
		ast_log(LOG_WARNING, "Invalid Time Spec.\n");
		return -1;
	}

	if (iftrue)
		iftrue = ast_strip_quoted(iftrue, "\"", "\"");
	if (iffalse)
		iffalse = ast_strip_quoted(iffalse, "\"", "\"");

	ast_copy_string(buf, ast_check_timing(&timing) ? S_OR(iftrue, "") : S_OR(iffalse, ""), len);

	return 0;
}
static void set_redirecting_reason(pjsip_fromto_hdr *hdr,
				   struct ast_party_redirecting_reason *data)
{
	static const pj_str_t reason_name = { "reason", 6 };
	pjsip_param *reason = pjsip_param_find(&hdr->other_param, &reason_name);
	char *reason_str;

	if (!reason) {
		return;
	}

	set_redirecting_value(&data->str, &reason->value);
	if (!data->str) {
		/* Oops, allocation failure */
		return;
	}
	reason_str = ast_strdupa(data->str);

	/* Remove any enclosing double-quotes */
	if (*reason_str == '"') {
		reason_str = ast_strip_quoted(reason_str, "\"", "\"");
	}

	data->code = ast_redirecting_reason_parse(reason_str);
	if (data->code < 0) {
		data->code = AST_REDIRECTING_REASON_UNKNOWN;
	} else {
		ast_free(data->str);
		data->str = ast_strdup("");
	}
}
Exemple #3
0
int ast_callerid_parse(char *input_str, char **name, char **location)
{
	char *ls;
	char *le;
	char *name_start;
	char *instr;
	int quotes_stripped = 0;

	/* Handle surrounding quotes */
	input_str = ast_strip(input_str);
	instr = ast_strip_quoted(input_str, "\"", "\"");
	if (instr != input_str) {
		quotes_stripped = 1;
	}

	/* Try "name" <location> format or name <location> format or with a missing > */
	if ((ls = strrchr(instr, '<'))) {
		if ((le = strrchr(ls, '>'))) {
			*le = '\0';	/* location found, trim off the brackets */
		}
		*ls = '\0';
		*location = ls + 1;	/* and this is the result */

		name_start = ast_strip_quoted(instr, "\"", "\"");
	} else {	/* no valid brackets */
		char tmp[256];

		ast_copy_string(tmp, instr, sizeof(tmp));
		ast_shrink_phone_number(tmp);
		if (!quotes_stripped && ast_isphonenumber(tmp)) {	/* Assume it's just a location */
			name_start = NULL;
			strcpy(instr, tmp); /* safe, because tmp will always be the same size or smaller than instr */
			*location = instr;
		} else { /* Assume it's just a name. */
			*location = NULL;
			name_start = ast_strip_quoted(instr, "\"", "\"");
		}
	}

	if (name_start) {
		ast_unescape_quoted(name_start);
	}
	*name = name_start;
	return 0;
}
static void *xpidf_allocate_body(void *data)
{
	struct ast_sip_exten_state_data *state_data = data;
	char *local = ast_strdupa(state_data->local);
	pjxpidf_pres *pres;
	pj_str_t name;

	pres = pjxpidf_create(state_data->pool, pj_cstr(&name, ast_strip_quoted(local, "<", ">")));
	return pres;
}
static int dialog_info_generate_body_content(void *body, void *data)
{
	pj_xml_node *dialog_info = body, *dialog, *state;
	struct ast_sip_exten_state_data *state_data = data;
	char *local = ast_strdupa(state_data->local), *stripped, *statestring = NULL;
	char *pidfstate = NULL, *pidfnote = NULL;
	enum ast_sip_pidf_state local_state;
	unsigned int version;
	char version_str[32], sanitized[PJSIP_MAX_URL_SIZE];

	if (!local || !state_data->datastores) {
		return -1;
	}

	if (dialog_info_xml_get_version(state_data->datastores, &version)) {
		ast_log(LOG_WARNING, "dialog-info+xml version could not be retrieved from datastore\n");
		return -1;
	}

	stripped = ast_strip_quoted(local, "<", ">");
	ast_sip_sanitize_xml(stripped, sanitized, sizeof(sanitized));

	ast_sip_presence_exten_state_to_str(state_data->exten_state, &statestring,
			&pidfstate, &pidfnote, &local_state);

	ast_sip_presence_xml_create_attr(state_data->pool, dialog_info, "xmlns", "urn:ietf:params:xml:ns:dialog-info");

	snprintf(version_str, sizeof(version_str), "%u", version);
	ast_sip_presence_xml_create_attr(state_data->pool, dialog_info, "version", version_str);

	ast_sip_presence_xml_create_attr(state_data->pool, dialog_info, "state", "full");
	ast_sip_presence_xml_create_attr(state_data->pool, dialog_info, "entity", sanitized);

	dialog = ast_sip_presence_xml_create_node(state_data->pool, dialog_info, "dialog");
	ast_sip_presence_xml_create_attr(state_data->pool, dialog, "id", state_data->exten);
	if (state_data->exten_state == AST_EXTENSION_RINGING) {
		ast_sip_presence_xml_create_attr(state_data->pool, dialog, "direction", "recipient");
	}

	state = ast_sip_presence_xml_create_node(state_data->pool, dialog, "state");
	pj_strdup2(state_data->pool, &state->content, statestring);

	if (state_data->exten_state == AST_EXTENSION_ONHOLD) {
		pj_xml_node *local_node, *target, *param;

		local_node = ast_sip_presence_xml_create_node(state_data->pool, dialog, "local");
		target = ast_sip_presence_xml_create_node(state_data->pool, local_node, "target");
		ast_sip_presence_xml_create_attr(state_data->pool, target, "uri", sanitized);
		param = ast_sip_presence_xml_create_node(state_data->pool, target, "param");
		ast_sip_presence_xml_create_attr(state_data->pool, param, "pname", "+sip.rendering");
		ast_sip_presence_xml_create_attr(state_data->pool, param, "pvalue", "no");
	}

	return 0;
}
static struct ast_variable *parse_cookies(char *cookies)
{
	char *cur;
	struct ast_variable *vars = NULL, *var;

	/* Skip Cookie: */
	cookies += 8;

	while ((cur = strsep(&cookies, ";"))) {
		char *name, *val;
		
		name = val = cur;
		strsep(&val, "=");

		if (ast_strlen_zero(name) || ast_strlen_zero(val)) {
			continue;
		}

		name = ast_strip(name);
		val = ast_strip_quoted(val, "\"", "\"");

		if (ast_strlen_zero(name) || ast_strlen_zero(val)) {
			continue;
		}

		if (option_debug) {
			ast_log(LOG_DEBUG, "mmm ... cookie!  Name: '%s'  Value: '%s'\n", name, val);
		}

		var = ast_variable_new(name, val);
		var->next = vars;
		vars = var;
	}

	return vars;
}
Exemple #7
0
int ast_sip_validate_uri_length(const char *contact_uri)
{
	int max_length = pj_max_hostname - 1;
	char *contact = ast_strdupa(contact_uri);
	char *host;
	char *at;
	int theres_a_port = 0;

	if (strlen(contact_uri) > pjsip_max_url_size - 1) {
		return -1;
	}

	contact = ast_strip_quoted(contact, "<", ">");

	if (!strncasecmp(contact, "sip:", 4)) {
		host = contact + 4;
	} else if (!strncasecmp(contact, "sips:", 5)) {
		host = contact + 5;
	} else {
		/* Not a SIP URI */
		return -1;
	}

	at = strchr(contact, '@');
	if (at) {
		/* sip[s]:user@host */
		host = at + 1;
	}

	if (host[0] == '[') {
		/* Host is an IPv6 address. Just get up to the matching bracket */
		char *close_bracket;

		close_bracket = strchr(host, ']');
		if (!close_bracket) {
			return -1;
		}
		close_bracket++;
		if (*close_bracket == ':') {
			theres_a_port = 1;
		}
		*close_bracket = '\0';
	} else {
		/* uri parameters could contain ';' so trim them off first */
		host = strsep(&host, ";?");
		/* Host is FQDN or IPv4 address. Need to find closing delimiter */
		if (strchr(host, ':')) {
			theres_a_port = 1;
			host = strsep(&host, ":");
		}
	}

	if (!theres_a_port) {
		max_length -= strlen("_sips.tcp.");
	}

	if (strlen(host) > max_length) {
		return -1;
	}

	return 0;
}