#include "asterisk/channel.h"
#include <netinet/in.h>
#include <time.h>
Include dependency graph for astosp.h:

This graph shows which files directly or indirectly include this file:

Go to the source code of this file.
Functions | |
| int | ast_osp_lookup (struct ast_channel *chan, char *provider, char *extension, char *callerid, struct ast_osp_result *result) |
| int | ast_osp_next (struct ast_osp_result *result, int cause) |
| int | ast_osp_terminate (int handle, int cause, time_t start, time_t duration) |
| int | ast_osp_validate (char *provider, char *token, int *handle, unsigned int *timeout, char *callerid, struct in_addr addr, char *extension) |
Definition in file astosp.h.
|
||||||||||||||||||||||||
|
Definition at line 517 of file res_osp.c. References ast_autoservice_start(), ast_autoservice_stop(), ast_base64encode(), ast_callerid_parse(), ast_channel_cmpwhentohangup(), ast_channel_setwhentohangup(), ast_isphonenumber(), ast_log(), ast_mutex_lock(), ast_mutex_unlock(), ast_shrink_phone_number(), ast_osp_result::dest, ast_osp_result::handle, osp_provider::handle, LOG_DEBUG, LOG_NOTICE, LOG_WARNING, n, osp_provider::name, osp_provider::next, ast_osp_result::numresults, OSP_MAX, pbx_builtin_getvar_helper(), osp_provider::source, ast_osp_result::tech, and ast_osp_result::token. Referenced by osplookup_exec(). 00518 {
00519 int cres;
00520 int res = 0;
00521 int counts;
00522 int tokenlen;
00523 unsigned int dummy=0;
00524 unsigned int timelimit;
00525 unsigned int callidlen;
00526 char callidstr[OSPC_CALLID_MAXSIZE] = "";
00527 struct osp_provider *osp;
00528 char source[OSP_MAX] = ""; /* Same length as osp->source */
00529 char callednum[2048]="";
00530 char callingnum[2048]="";
00531 char destination[2048]="";
00532 char token[2000];
00533 char tmp[256]="", *l, *n;
00534 OSPE_DEST_PROT prot;
00535 OSPE_DEST_OSP_ENABLED ospenabled;
00536 char *devinfo = NULL;
00537
00538 result->handle = -1;
00539 result->numresults = 0;
00540 result->tech[0] = '\0';
00541 result->dest[0] = '\0';
00542 result->token[0] = '\0';
00543
00544 if (!provider || !strlen(provider))
00545 provider = "default";
00546
00547 if (!callerid)
00548 callerid = "";
00549 ast_copy_string(tmp, callerid, sizeof(tmp));
00550 ast_callerid_parse(tmp, &n, &l);
00551 if (!l)
00552 l = "";
00553 else {
00554 ast_shrink_phone_number(l);
00555 if (!ast_isphonenumber(l))
00556 l = "";
00557 }
00558 callerid = l;
00559
00560 if (chan) {
00561 cres = ast_autoservice_start(chan);
00562 if (cres < 0)
00563 return cres;
00564 }
00565 ast_mutex_lock(&osplock);
00566 osp = providers;
00567 while(osp) {
00568 if (!strcasecmp(osp->name, provider)) {
00569 if (OSPPTransactionNew(osp->handle, &result->handle)) {
00570 ast_log(LOG_WARNING, "Unable to create OSP Transaction handle!\n");
00571 } else {
00572 ast_copy_string(source, osp->source, sizeof(source));
00573 res = 1;
00574 }
00575 break;
00576 }
00577 osp = osp->next;
00578 }
00579 ast_mutex_unlock(&osplock);
00580 if (res) {
00581 res = 0;
00582 /* No more than 10 back */
00583 counts = 10;
00584 dummy = 0;
00585 devinfo = pbx_builtin_getvar_helper (chan, "OSPPEER");
00586 if (!devinfo) {
00587 devinfo = "";
00588 }
00589 if (!OSPPTransactionRequestAuthorisation(result->handle, source, devinfo,
00590 callerid,OSPC_E164, extension, OSPC_E164, NULL, 0, NULL, NULL, &counts, &dummy, NULL)) {
00591 if (counts) {
00592 tokenlen = sizeof(token);
00593 result->numresults = counts - 1;
00594 callidlen = sizeof(callidstr);
00595 if (!OSPPTransactionGetFirstDestination(result->handle, 0, NULL, NULL, &timelimit, &callidlen, callidstr,
00596 sizeof(callednum), callednum, sizeof(callingnum), callingnum, sizeof(destination), destination, 0, NULL, &tokenlen, token)) {
00597 ast_log(LOG_DEBUG, "Got destination '%s' and called: '%s' calling: '%s' for '%s' (provider '%s')\n",
00598 destination, callednum, callingnum, extension, provider);
00599 /* Only support OSP server with only one duration limit */
00600 if (ast_channel_cmpwhentohangup (chan, timelimit) < 0) {
00601 ast_channel_setwhentohangup (chan, timelimit);
00602 }
00603 do {
00604 if (!OSPPTransactionIsDestOSPEnabled (result->handle, &ospenabled) && (ospenabled == OSPE_OSP_FALSE)) {
00605 result->token[0] = 0;
00606 }
00607 else {
00608 ast_base64encode(result->token, token, tokenlen, sizeof(result->token) - 1);
00609 }
00610 if ((strlen(destination) > 2) && !OSPPTransactionGetDestProtocol(result->handle, &prot)) {
00611 res = 1;
00612 /* Strip leading and trailing brackets */
00613 destination[strlen(destination) - 1] = '\0';
00614 switch(prot) {
00615 case OSPE_DEST_PROT_H323_SETUP:
00616 ast_copy_string(result->tech, "H323", sizeof(result->tech));
00617 snprintf(result->dest, sizeof(result->dest), "%s@%s", callednum, destination + 1);
00618 break;
00619 case OSPE_DEST_PROT_SIP:
00620 ast_copy_string(result->tech, "SIP", sizeof(result->tech));
00621 snprintf(result->dest, sizeof(result->dest), "%s@%s", callednum, destination + 1);
00622 break;
00623 case OSPE_DEST_PROT_IAX:
00624 ast_copy_string(result->tech, "IAX", sizeof(result->tech));
00625 snprintf(result->dest, sizeof(result->dest), "%s@%s", callednum, destination + 1);
00626 break;
00627 default:
00628 ast_log(LOG_DEBUG, "Unknown destination protocol '%d', skipping...\n", prot);
00629 res = 0;
00630 }
00631 if (!res && result->numresults) {
00632 result->numresults--;
00633 callidlen = sizeof(callidstr);
00634 if (OSPPTransactionGetNextDestination(result->handle, OSPC_FAIL_INCOMPATIBLE_DEST, 0, NULL, NULL, &timelimit, &callidlen, callidstr,
00635 sizeof(callednum), callednum, sizeof(callingnum), callingnum, sizeof(destination), destination, 0, NULL, &tokenlen, token)) {
00636 break;
00637 }
00638 }
00639 } else {
00640 ast_log(LOG_DEBUG, "Missing destination protocol\n");
00641 break;
00642 }
00643 } while(!res && result->numresults);
00644 }
00645 }
00646
00647 }
00648 if (!res) {
00649 OSPPTransactionDelete(result->handle);
00650 result->handle = -1;
00651 }
00652
00653 }
00654 if (!osp)
00655 ast_log(LOG_NOTICE, "OSP Provider '%s' does not exist!\n", provider);
00656 if (chan) {
00657 cres = ast_autoservice_stop(chan);
00658 if (cres < 0)
00659 return cres;
00660 }
00661 return res;
00662 }
|
|
||||||||||||
|
Definition at line 664 of file res_osp.c. References ast_base64encode(), ast_log(), ast_osp_result::dest, ast_osp_result::handle, LOG_DEBUG, ast_osp_result::numresults, ast_osp_result::tech, and ast_osp_result::token. Referenced by ospnext_exec(). 00665 {
00666 int res = 0;
00667 int tokenlen;
00668 unsigned int dummy=0;
00669 unsigned int timelimit;
00670 unsigned int callidlen;
00671 char callidstr[OSPC_CALLID_MAXSIZE] = "";
00672 char callednum[2048]="";
00673 char callingnum[2048]="";
00674 char destination[2048]="";
00675 char token[2000];
00676 OSPE_DEST_PROT prot;
00677 OSPE_DEST_OSP_ENABLED ospenabled;
00678
00679 result->tech[0] = '\0';
00680 result->dest[0] = '\0';
00681 result->token[0] = '\0';
00682
00683 if (result->handle > -1) {
00684 dummy = 0;
00685 if (result->numresults) {
00686 tokenlen = sizeof(token);
00687 while(!res && result->numresults) {
00688 result->numresults--;
00689 callidlen = sizeof(callidstr);
00690 if (!OSPPTransactionGetNextDestination(result->handle, OSPC_FAIL_INCOMPATIBLE_DEST, 0, NULL, NULL, &timelimit, &callidlen, callidstr,
00691 sizeof(callednum), callednum, sizeof(callingnum), callingnum, sizeof(destination), destination, 0, NULL, &tokenlen, token)) {
00692 if (!OSPPTransactionIsDestOSPEnabled (result->handle, &ospenabled) && (ospenabled == OSPE_OSP_FALSE)) {
00693 result->token[0] = 0;
00694 }
00695 else {
00696 ast_base64encode(result->token, token, tokenlen, sizeof(result->token) - 1);
00697 }
00698 if ((strlen(destination) > 2) && !OSPPTransactionGetDestProtocol(result->handle, &prot)) {
00699 res = 1;
00700 /* Strip leading and trailing brackets */
00701 destination[strlen(destination) - 1] = '\0';
00702 switch(prot) {
00703 case OSPE_DEST_PROT_H323_SETUP:
00704 ast_copy_string(result->tech, "H323", sizeof(result->tech));
00705 snprintf(result->dest, sizeof(result->dest), "%s@%s", callednum, destination + 1);
00706 break;
00707 case OSPE_DEST_PROT_SIP:
00708 ast_copy_string(result->tech, "SIP", sizeof(result->tech));
00709 snprintf(result->dest, sizeof(result->dest), "%s@%s", callednum, destination + 1);
00710 break;
00711 case OSPE_DEST_PROT_IAX:
00712 ast_copy_string(result->tech, "IAX", sizeof(result->tech));
00713 snprintf(result->dest, sizeof(result->dest), "%s@%s", callednum, destination + 1);
00714 break;
00715 default:
00716 ast_log(LOG_DEBUG, "Unknown destination protocol '%d', skipping...\n", prot);
00717 res = 0;
00718 }
00719 } else {
00720 ast_log(LOG_DEBUG, "Missing destination protocol\n");
00721 break;
00722 }
00723 }
00724 }
00725
00726 }
00727 if (!res) {
00728 OSPPTransactionDelete(result->handle);
00729 result->handle = -1;
00730 }
00731
00732 }
00733 return res;
00734 }
|
|
||||||||||||||||||||
|
Definition at line 755 of file res_osp.c. References ast_log(), cause2reason(), LOG_DEBUG, and LOG_WARNING. Referenced by ospfinished_exec(), and sip_hangup(). 00756 {
00757 unsigned int dummy = 0;
00758 int res = -1;
00759 enum OSPEFAILREASON reason;
00760
00761 time_t endTime = 0;
00762 time_t alertTime = 0;
00763 time_t connectTime = 0;
00764 unsigned isPddInfoPresent = 0;
00765 unsigned pdd = 0;
00766 unsigned releaseSource = 0;
00767 unsigned char *confId = "";
00768
00769 reason = cause2reason(cause);
00770 if (OSPPTransactionRecordFailure(handle, reason))
00771 ast_log(LOG_WARNING, "Failed to record call termination for handle %d\n", handle);
00772 else if (OSPPTransactionReportUsage(handle, duration, start,
00773 endTime,alertTime,connectTime,isPddInfoPresent,pdd,releaseSource,confId,
00774 0, 0, 0, 0, &dummy, NULL))
00775 ast_log(LOG_WARNING, "Failed to report duration for handle %d\n", handle);
00776 else {
00777 ast_log(LOG_DEBUG, "Completed recording handle %d\n", handle);
00778 OSPPTransactionDelete(handle);
00779 res = 0;
00780 }
00781 return res;
00782 }
|
|
||||||||||||||||||||||||||||||||
|
Definition at line 456 of file res_osp.c. References ast_base64decode(), ast_callerid_parse(), ast_inet_ntoa(), ast_isphonenumber(), ast_log(), ast_mutex_lock(), ast_mutex_unlock(), ast_shrink_phone_number(), ast_strdupa, osp_provider::handle, LOG_DEBUG, LOG_WARNING, n, osp_provider::name, osp_provider::next, OSP_MAX, osp_provider::source, and tokenformat. Referenced by check_osptoken(). 00457 {
00458 char tmp[256]="", *l, *n;
00459 char iabuf[INET_ADDRSTRLEN];
00460 char source[OSP_MAX] = ""; /* Same length as osp->source */
00461 char *token2;
00462 int tokenlen;
00463 struct osp_provider *osp;
00464 int res = 0;
00465 unsigned int authorised, dummy;
00466
00467 if (!provider || !strlen(provider))
00468 provider = "default";
00469
00470 token2 = ast_strdupa(token);
00471 if (!token2)
00472 return -1;
00473 tokenlen = ast_base64decode(token2, token, strlen(token));
00474 *handle = -1;
00475 if (!callerid)
00476 callerid = "";
00477 ast_copy_string(tmp, callerid, sizeof(tmp));
00478 ast_callerid_parse(tmp, &n, &l);
00479 if (!l)
00480 l = "";
00481 else {
00482 ast_shrink_phone_number(l);
00483 if (!ast_isphonenumber(l))
00484 l = "";
00485 }
00486 callerid = l;
00487 ast_mutex_lock(&osplock);
00488 ast_inet_ntoa(iabuf, sizeof(iabuf), addr);
00489 osp = providers;
00490 while(osp) {
00491 if (!strcasecmp(osp->name, provider)) {
00492 if (OSPPTransactionNew(osp->handle, handle)) {
00493 ast_log(LOG_WARNING, "Unable to create OSP Transaction handle!\n");
00494 } else {
00495 ast_copy_string(source, osp->source, sizeof(source));
00496 res = 1;
00497 }
00498 break;
00499 }
00500 osp = osp->next;
00501 }
00502 ast_mutex_unlock(&osplock);
00503 if (res) {
00504 res = 0;
00505 dummy = 0;
00506 if (!OSPPTransactionValidateAuthorisation(*handle, iabuf, source, NULL, NULL,
00507 callerid, OSPC_E164, extension, OSPC_E164, 0, "", tokenlen, token2, &authorised, timelimit, &dummy, NULL, tokenformat)) {
00508 if (authorised) {
00509 ast_log(LOG_DEBUG, "Validated token for '%s' from '%s@%s'\n", extension, callerid, iabuf);
00510 res = 1;
00511 }
00512 }
00513 }
00514 return res;
00515 }
|
1.4.2