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(""); } }
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; }
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; }