';
$html .= _("CID Lookup Source");
$html .= '
| ';
$html .= '';
$html .= '| ';
$html .= _("Source").''._("Sources can be added in Caller Name Lookup Sources section").'.: | ';
$html .= ' |
';
/*
// Not yet fully implemented
$html .= '';
$html .= '| ';
$html .= _("Overwrite Caller Name").''._("This option let the source specified overwrite the caller name if already supplied from telco").'.: | ';
$html .= ' | ';
$html .= '
';
*/
}
return $html;
}
function cidlookup_hookProcess_core($viewing_itemid, $request) {
// TODO: move sql to functions cidlookup_did_(add, del, edit)
if (!isset($request['action']))
return;
switch ($request['action']) {
case 'addIncoming':
$results = sql(sprintf('INSERT INTO cidlookup_incoming (cidlookup_id, extension, cidnum) VALUES ("%d", "%s", "%s")',
$request['cidlookup_id'], $request['extension'], $request['cidnum']));
break;
case 'delIncoming':
$extarray = explode('/', $request['extdisplay'], 2);
$results = sql(sprintf("DELETE FROM cidlookup_incoming WHERE extension = '%s' AND cidnum = '%s'",
$extarray[0], $extarray[1]));
break;
case 'edtIncoming': // deleting and adding as in core module
$extarray = explode('/', $request['extdisplay'], 2);
$results = sql(sprintf("DELETE FROM cidlookup_incoming WHERE extension = '%s' AND cidnum = '%s'",
$extarray[0], $extarray[1]));
$results = sql(sprintf('INSERT INTO cidlookup_incoming (cidlookup_id, extension, cidnum) VALUES ("%d", "%s", "%s")',
$request['cidlookup_id'], $request['extension'], $request['cidnum']));
break;
}
}
function cidlookup_hookGet_config($engine) {
// TODO: integrating with direct extension <-> DID association
// TODO: add option to avoid callerid lookup if the telco already supply a callerid name (GosubIf)
global $ext; // is this the best way to pass this?
switch($engine) {
case "asterisk":
$pairing = cidlookup_did_list();
if(is_array($pairing)) {
foreach($pairing as $item) {
if ($item['cidlookup_id'] != 0) {
// Code from modules/core/functions.inc.php core_get_config inbound routes
$exten = trim($item['extension']);
$cidnum = trim($item['cidnum']);
if ($cidnum != '' && $exten == '') {
$exten = 's';
$pricid = ($item['pricid']) ? true:false;
} else if (($cidnum != '' && $exten != '') || ($cidnum == '' && $exten == '')) {
$pricid = true;
} else {
$pricid = false;
}
$context = ($pricid) ? "ext-did-0001":"ext-did-0002";
$exten = (empty($exten)?"s":$exten);
$exten = $exten.(empty($cidnum)?"":"/".$cidnum); //if a CID num is defined, add it
$ext->splice($context, $exten, 1, new ext_gosub('1', 'cidlookup_'.$item['cidlookup_id'], 'cidlookup'));
}
}
}
break;
}
}
/*
// Generates dialplan for cidlookup
// We call this with retrieve_conf
*/
function cidlookup_get_config($engine) {
// TODO: discuss if mysql and http lookup should be implemented in dialplan or in an external AGI
global $ext; // is this the best way to pass this?
global $asterisk_conf;
global $version;
switch($engine) {
case "asterisk":
$sources = cidlookup_list(true);
if(is_array($sources)) {
foreach($sources as $item) {
// Search for number in the cache, if found lookupcidnum and return
if ($item['cidlookup_id'] != 0) {
if ($item['cache'] == 1 && $item['sourcetype'] != 'internal') {
$ext->add('cidlookup', 'cidlookup_'.$item['cidlookup_id'], '', new ext_gotoif('$[${DB_EXISTS(cidname/${CALLERID(num)})} = 1]', 'cidlookup,cidlookup_return,1'));
}
}
switch($item['sourcetype']) {
case "internal":
$ext->add('cidlookup', 'cidlookup_'.$item['cidlookup_id'], '', new ext_lookupcidname(''));
break;
case "enum":
$ext->add('cidlookup', 'cidlookup_'.$item['cidlookup_id'], '', new ext_setvar('CALLERID(name)', '${TXTCIDNAME(${CALLERID(num)})}'));
break;
case "http":
if (!empty($item['http_username']) && !empty($item['http_password']))
$auth = sprintf('%s:%s@', $item['http_username'], $item['http_password']);
else
$auth = '';
if (!empty($item['http_port']))
$host = sprintf('%s:%d', $item['http_host'], $item['http_port']);
else
$host = $item['http_host'].':80';
if (substr($item['http_path'], 0, 1) == '/')
$path = substr($item['http_path'], 1);
else
$path = $item['http_path'];
$query = str_replace('[NUMBER]', '${CALLERID(num)}', $item['http_query']);
$url = sprintf('http://%s%s/%s?%s', $auth, $host, $path, $query);
$curl = sprintf('${CURL(%s)}', $url);
$ext->add('cidlookup', 'cidlookup_'.$item['cidlookup_id'], '', new ext_setvar('CALLERID(name)', $curl));
break;
case "mysql":
if (version_compare($version, "1.6", "lt")) {
//Escaping MySQL query - thanks to http://www.asteriskgui.com/index.php?get=utilities-mysqlscape
$replacements = array (
'\\' => '\\\\',
'"' => '\\"',
'\'' => '\\\'',
' ' => '\\ ',
',' => '\\,',
'(' => '\\(',
')' => '\\)',
'.' => '\\.',
'|' => '\\|'
);
$query = str_replace(array_keys($replacements), array_values($replacements), $item['mysql_query']);
} else {
$query = $item['mysql_query'];
}
$query = str_replace('[NUMBER]', '${CALLERID(num)}', $query);
$ext->add('cidlookup', 'cidlookup_'.$item['cidlookup_id'], '', new ext_mysql_connect('connid', $item['mysql_host'], $item['mysql_username'], $item['mysql_password'], $item['mysql_dbname']));
$ext->add('cidlookup', 'cidlookup_'.$item['cidlookup_id'], '', new ext_mysql_query('resultid', 'connid', $query));
$ext->add('cidlookup', 'cidlookup_'.$item['cidlookup_id'], '', new ext_mysql_fetch('fetchid', 'resultid', 'CALLERID(name)'));
$ext->add('cidlookup', 'cidlookup_'.$item['cidlookup_id'], '', new ext_mysql_clear('resultid'));
$ext->add('cidlookup', 'cidlookup_'.$item['cidlookup_id'], '', new ext_mysql_disconnect('connid'));
break;
// TODO: implement SugarCRM lookup, look at code snippet at http://nerdvittles.com/index.php?p=82
case "sugarcrm":
$ext->add('cidlookup', 'cidlookup_'.$item['cidlookup_id'], '', new ext_noop('SugarCRM not yet implemented'));
$ext->add('cidlookup', 'cidlookup_'.$item['cidlookup_id'], '', new ext_return(''));
break;
}
// Put numbers in the cache
if ($item['cidlookup_id'] != 0) {
if ($item['cache'] == 1 && $item['sourcetype'] != 'internal') {
$ext->add('cidlookup', 'cidlookup_'.$item['cidlookup_id'], '', new ext_db_put('cidname', '${CALLERID(num)}', '${CALLERID(name)}' ));
}
$ext->add('cidlookup', 'cidlookup_'.$item['cidlookup_id'], '', new ext_return(''));
}
}
$ext->add('cidlookup', 'cidlookup_return', '', new ext_lookupcidname(''));
$ext->add('cidlookup', 'cidlookup_return', '', new ext_return(''));
}
break;
}
}
function cidlookup_did_get($did){
$extarray = explode('/', $did, 2);
if(count($extarray) == 2) { // differentiate beetween '//' (Any did / any cid and '' empty string)
$sql = sprintf("SELECT cidlookup_id FROM cidlookup_incoming WHERE extension = '%s' AND cidnum = '%s'", $extarray[0], $extarray[1]);
$result = sql($sql, "getRow", DB_FETCHMODE_ASSOC);
if(is_array($result)){
return $result['cidlookup_id'];
} else
return null;
} else { // $did is an empty string (for example when adding a new did)
return 0;
}
}
function cidlookup_did_list() {
$sql = "
SELECT cidlookup_id, a.extension extension, a.cidnum cidnum, pricid FROM cidlookup_incoming a
INNER JOIN incoming b
ON a.extension = b.extension AND a.cidnum = b.cidnum
";
$results = sql($sql,"getAll",DB_FETCHMODE_ASSOC);
return is_array($results)?$results:null;
}
function cidlookup_list($all=false) {
$allowed = array(array('cidlookup_id' => 0, 'description' => _("None"), 'sourcetype' => null));
$results = sql("SELECT * FROM cidlookup","getAll",DB_FETCHMODE_ASSOC);
if(is_array($results)){
foreach($results as $result){
// check to see if we have a dept match for the current AMP User.
if ($all || checkDept($result['deptname'])){
// return this item
$allowed[] = $result;
}
}
}
return isset($allowed)?$allowed:null;
}
function cidlookup_get($id){
$results = sql("SELECT * FROM cidlookup WHERE cidlookup_id = '$id'","getRow",DB_FETCHMODE_ASSOC);
return isset($results)?$results:null;
}
function cidlookup_del($id){
// Deleting source and its associations
$results = sql("DELETE FROM cidlookup WHERE cidlookup_id = '$id'","query");
$results = sql("DELETE FROM cidlookup_incoming WHERE cidlookup_id = '$id'","query");
}
function cidlookup_add($post){
global $db;
$description = $db->escapeSimple($post['description']);
$sourcetype = $db->escapeSimple($post['sourcetype']);
$deptname = $db->escapeSimple($post['deptname']);
$http_host = $db->escapeSimple($post['http_host']);
$http_port = $db->escapeSimple($post['http_port']);
$http_username = $db->escapeSimple($post['http_username']);
$http_password = $db->escapeSimple($post['http_password']);
$http_path = $db->escapeSimple($post['http_path']);
$http_query = $db->escapeSimple($post['http_query']);
$mysql_host = $db->escapeSimple($post['mysql_host']);
$mysql_dbname = $db->escapeSimple($post['mysql_dbname']);
$mysql_query = $db->escapeSimple($post['mysql_query']);
$mysql_username = $db->escapeSimple($post['mysql_username']);
$mysql_password = $db->escapeSimple($post['mysql_password']);
$cache = isset($post['cache']) ? $db->escapeSimple($post['cache']) : 0;
$results = sql("
INSERT INTO cidlookup
(description, sourcetype, cache, deptname, http_host, http_port, http_username, http_password, http_path, http_query, mysql_host, mysql_dbname, mysql_query, mysql_username, mysql_password)
VALUES
('$description', '$sourcetype', '$cache', '$deptname', '$http_host', '$http_port', '$http_username', '$http_password', '$http_path', '$http_query', '$mysql_host', '$mysql_dbname', '$mysql_query', '$mysql_username', '$mysql_password')
");
}
function cidlookup_edit($id,$post){
global $db;
$description = $db->escapeSimple($post['description']);
$sourcetype = $db->escapeSimple($post['sourcetype']);
$deptname = $db->escapeSimple($post['deptname']);
$http_host = $db->escapeSimple($post['http_host']);
$http_port = $db->escapeSimple($post['http_port']);
$http_username = $db->escapeSimple($post['http_username']);
$http_password = $db->escapeSimple($post['http_password']);
$http_path = $db->escapeSimple($post['http_path']);
$http_query = $db->escapeSimple($post['http_query']);
$mysql_host = $db->escapeSimple($post['mysql_host']);
$mysql_dbname = $db->escapeSimple($post['mysql_dbname']);
$mysql_query = $db->escapeSimple($post['mysql_query']);
$mysql_username = $db->escapeSimple($post['mysql_username']);
$mysql_password = $db->escapeSimple($post['mysql_password']);
if (isset($post['cache']) && $post['cache'] != 1) {
$cache = 0;
}
$results = sql("
UPDATE cidlookup
SET
description = '$description',
deptname = '$deptname',
sourcetype = '$sourcetype' ,
cache = '$cache',
http_host = '$http_host',
http_port = '$http_port',
http_username = '$http_username',
http_password = '$http_password',
http_path = '$http_path',
http_query = '$http_query',
mysql_host = '$mysql_host',
mysql_dbname = '$mysql_dbname',
mysql_query = '$mysql_query',
mysql_username = '$mysql_username',
mysql_password = '$mysql_password'
WHERE cidlookup_id = '$id'");
}
?>