diff --git a/res/res_osp.c b/res/res_osp.c index ce2988c322..1c00531aa9 100644 --- a/res/res_osp.c +++ b/res/res_osp.c @@ -516,6 +516,44 @@ int ast_osp_validate(char *provider, char *token, int *handle, unsigned int *tim return res; } +static int check_dest(struct ast_osp_result *result, char *token, int tokensize) +{ + OSPE_DEST_OSP_ENABLED enabled; + OSPE_DEST_PROT prot; + int res = 1; + + /* Check destination OSP version */ + if (!OSPPTransactionIsDestOSPEnabled(result->handle, &enabled) && (enabled == OSPE_OSP_FALSE)) { + result->token[0] = 0; + } else { + ast_base64encode(result->token, token, tokensize, sizeof(result->token) - 1); + } + + /* Check destination protocol */ + if (OSPPTransactionGetDestProtocol(result->handle, &prot)) { + prot = OSPE_DEST_PROT_UNDEFINED; + } + switch(prot) { + case OSPE_DEST_PROT_UNDEFINED: /* Protocol is not configured, use SIP as default */ + case OSPE_DEST_PROT_SIP: + ast_copy_string(result->tech, "SIP", sizeof(result->tech)); + break; + case OSPE_DEST_PROT_H323_SETUP: + ast_copy_string(result->tech, "H323", sizeof(result->tech)); + break; + case OSPE_DEST_PROT_IAX: + ast_copy_string(result->tech, "IAX", sizeof(result->tech)); + break; + case OSPE_DEST_PROT_H323_LRQ: + case OSPE_DEST_PROT_UNKNOWN: + default: + ast_log(LOG_DEBUG, "Unknown destination protocol '%d', skipping...\n", prot); + res = 0; + } + + return res; +} + int ast_osp_lookup(struct ast_channel *chan, char *provider, char *extension, char *callerid, struct ast_osp_result *result) { int cres; @@ -533,8 +571,6 @@ int ast_osp_lookup(struct ast_channel *chan, char *provider, char *extension, ch char destination[2048]=""; char token[2000]; char tmp[256]="", *l, *n; - OSPE_DEST_PROT prot; - OSPE_DEST_OSP_ENABLED ospenabled; char *devinfo = NULL; result->handle = -1; @@ -603,49 +639,27 @@ int ast_osp_lookup(struct ast_channel *chan, char *provider, char *extension, ch ast_channel_setwhentohangup (chan, timelimit); } do { - if (!OSPPTransactionIsDestOSPEnabled (result->handle, &ospenabled) && (ospenabled == OSPE_OSP_FALSE)) { - result->token[0] = 0; - } - else { - ast_base64encode(result->token, token, tokenlen, sizeof(result->token) - 1); - } - if ((strlen(destination) > 2) && !OSPPTransactionGetDestProtocol(result->handle, &prot)) { - res = 1; + if ((strlen(destination) > 2) && (check_dest(result, token, tokenlen))) { /* Strip leading and trailing brackets */ destination[strlen(destination) - 1] = '\0'; - switch(prot) { - case OSPE_DEST_PROT_H323_SETUP: - ast_copy_string(result->tech, "H323", sizeof(result->tech)); - snprintf(result->dest, sizeof(result->dest), "%s@%s", callednum, destination + 1); - break; - case OSPE_DEST_PROT_SIP: - ast_copy_string(result->tech, "SIP", sizeof(result->tech)); - snprintf(result->dest, sizeof(result->dest), "%s@%s", callednum, destination + 1); - break; - case OSPE_DEST_PROT_IAX: - ast_copy_string(result->tech, "IAX", sizeof(result->tech)); - snprintf(result->dest, sizeof(result->dest), "%s@%s", callednum, destination + 1); - break; - default: - ast_log(LOG_DEBUG, "Unknown destination protocol '%d', skipping...\n", prot); - res = 0; - } - if (!res && result->numresults) { + snprintf(result->dest, sizeof(result->dest), "%s@%s", callednum, destination + 1); + res = 1; + } else { + if(result->numresults) { result->numresults--; callidlen = sizeof(callidstr); - if (OSPPTransactionGetNextDestination(result->handle, OSPC_FAIL_INCOMPATIBLE_DEST, 0, NULL, NULL, &timelimit, &callidlen, callidstr, - sizeof(callednum), callednum, sizeof(callingnum), callingnum, sizeof(destination), destination, 0, NULL, &tokenlen, token)) { - break; + if (!OSPPTransactionGetNextDestination(result->handle, OSPC_FAIL_INCOMPATIBLE_DEST, 0, NULL, NULL, &timelimit, &callidlen, + callidstr, sizeof(callednum), callednum, sizeof(callingnum), callingnum, sizeof(destination), destination, 0, NULL, + &tokenlen, token)) + { + continue; } } - } else { - ast_log(LOG_DEBUG, "Missing destination protocol\n"); - break; } - } while(!res && result->numresults); + break; + } while (1); } } - } if (!res) { OSPPTransactionDelete(result->handle); @@ -667,7 +681,6 @@ int ast_osp_next(struct ast_osp_result *result, int cause) { int res = 0; int tokenlen; - unsigned int dummy=0; unsigned int timelimit; unsigned int callidlen; char callidstr[OSPC_CALLID_MAXSIZE] = ""; @@ -675,62 +688,33 @@ int ast_osp_next(struct ast_osp_result *result, int cause) char callingnum[2048]=""; char destination[2048]=""; char token[2000]; - OSPE_DEST_PROT prot; - OSPE_DEST_OSP_ENABLED ospenabled; result->tech[0] = '\0'; result->dest[0] = '\0'; result->token[0] = '\0'; if (result->handle > -1) { - dummy = 0; if (result->numresults) { tokenlen = sizeof(token); while(!res && result->numresults) { result->numresults--; callidlen = sizeof(callidstr); if (!OSPPTransactionGetNextDestination(result->handle, OSPC_FAIL_INCOMPATIBLE_DEST, 0, NULL, NULL, &timelimit, &callidlen, callidstr, - sizeof(callednum), callednum, sizeof(callingnum), callingnum, sizeof(destination), destination, 0, NULL, &tokenlen, token)) { - if (!OSPPTransactionIsDestOSPEnabled (result->handle, &ospenabled) && (ospenabled == OSPE_OSP_FALSE)) { - result->token[0] = 0; - } - else { - ast_base64encode(result->token, token, tokenlen, sizeof(result->token) - 1); - } - if ((strlen(destination) > 2) && !OSPPTransactionGetDestProtocol(result->handle, &prot)) { - res = 1; + sizeof(callednum), callednum, sizeof(callingnum), callingnum, sizeof(destination), destination, 0, NULL, &tokenlen, token)) + { + if ((strlen(destination) > 2) && check_dest(result, token, tokenlen)) { /* Strip leading and trailing brackets */ destination[strlen(destination) - 1] = '\0'; - switch(prot) { - case OSPE_DEST_PROT_H323_SETUP: - ast_copy_string(result->tech, "H323", sizeof(result->tech)); - snprintf(result->dest, sizeof(result->dest), "%s@%s", callednum, destination + 1); - break; - case OSPE_DEST_PROT_SIP: - ast_copy_string(result->tech, "SIP", sizeof(result->tech)); - snprintf(result->dest, sizeof(result->dest), "%s@%s", callednum, destination + 1); - break; - case OSPE_DEST_PROT_IAX: - ast_copy_string(result->tech, "IAX", sizeof(result->tech)); - snprintf(result->dest, sizeof(result->dest), "%s@%s", callednum, destination + 1); - break; - default: - ast_log(LOG_DEBUG, "Unknown destination protocol '%d', skipping...\n", prot); - res = 0; - } - } else { - ast_log(LOG_DEBUG, "Missing destination protocol\n"); - break; + snprintf(result->dest, sizeof(result->dest), "%s@%s", callednum, destination + 1); + res = 1; } } } - } if (!res) { OSPPTransactionDelete(result->handle); result->handle = -1; } - } return res; }