Hola, estaba programando unas mejoras para ver varias extensiones con el mismo usuario en CDR, grabaciones y resumen (summary by extension ) y me he dado cuenta que hay un fallo de seguridad que permite ver cualquier extension , sea tuya o no. basta con cambiar el parametro de get de extension.
Algo que requiere estar logueado, pero es un fallo de seguridad ya que permite ver las 10 llamadas entrantes y salientes mas usadas de cualquier extension.
el error se soluciona facil, voy a ponerlo ahora un pull request para que se actualice, no obstante para los que quieran les copio el codigo que puse para solucionarlo.
abrir el fichero
========================================================================================
FICHERO /var/www/html/modules/summary_by_extension]/index.php
busquen donde pone
//conexion resource
$pConfig = new paloConfig("/etc", "amportal.conf", "=", "[[:space:]]=[[:space:]]");
$arrConfig = $pConfig->leer_configuracion(false);
$dsnAsteriskCdr = $arrConfig['AMPDBENGINE']['valor']."://".
$arrConfig['AMPDBUSER']['valor']. ":".
$arrConfig['AMPDBPASS']['valor']. "@".
$arrConfig['AMPDBHOST']['valor']."/asteriskcdrdb";
$pDB_cdr = new paloDB($dsnAsteriskCdr);//asteriskcdrdb -> CDR
$pDB_billing = new paloDB("sqlite3:///$arrConf[issabel_dbdir]/rate.db"); //sqlite3 -> rate.db
y añadan justo debajo
//hgmnetwork.com obtenemos la extension del usuario realizamos la consulta
//conexion resource
$arrConf['dsn_conn_database'] = generarDSNSistema('asteriskuser', 'asteriskcdrdb');
$pDB = new paloDB($arrConf['dsn_conn_database']);
$pDBACL = new paloDB($arrConf['issabel_dsn']['acl']);
$pACL = new paloACL($pDBACL);
$user = isset($SESSION['issabel_user'])?$SESSION['issabel_user']:"";
$extension = $pACL->getUserExtension($user);
//miramos si es admin para que evite revisar las extensiones, admin puede ver todo
$isAdmin = ($pACL->isUserAdministratorGroup($user) !== FALSE);
$array_extensiones=explode(";",$extension);//pasamos los valores a un array por si son varias extensiones separadas por ;
luego buscamos donde pone
//actions
$accion = getAction();
$content = "";
switch($accion){
case 'graph':
$content = graphLinks($smarty, $module_name, $local_templates_dir);
break;
//actions
$accion = getAction();
$content = "";
switch($accion){
case 'graph':
$content = graphLinks($smarty, $module_name, $local_templates_dir,$extension,$isAdmin);
break;
'date_to' => $date_to,
);
$url = construirUrl($urlFields, array('nav', 'start'));
$urlFields['order_by'] = $order_by;
$urlFields['order_type'] = $order_type;
$smarty->assign("order_by", $order_by);
$smarty->assign("order_type", $order_type);
$arrData = null;
$arrResult = $pReportCall->ObtainReportCall($limit,$offset,$date_ini,$date_end,$type,$value,$order_by,$order_type);
if ($pReportCall->errMsg != '') {
$smarty->assign('mb_message', $pReportCall->errMsg);
}
$order_type = ($order_type == "desc")?"asc":"desc";
y añadimos la busqueda de extensiones y demas aqui debajo tambien
//hgmnetwork.com obtenemos la extension del usuario realizamos la consulta
//conexion resource
$arrConf['dsn_conn_database'] = generarDSNSistema('asteriskuser', 'asteriskcdrdb');
$pDB = new paloDB($arrConf['dsn_conn_database']);
$pDBACL = new paloDB($arrConf['issabel_dsn']['acl']);
$pACL = new paloACL($pDBACL);
$user = isset($SESSION['issabel_user'])?$SESSION['issabel_user']:"";
$extension = $pACL->getUserExtension($user);
//miramos si es admin para que evite revisar las extensiones, admin puede ver todo
$isAdmin = ($pACL->isUserAdministratorGroup($user) !== FALSE);
$array_extensiones=explode(";",$extension);//pasamos los valores a un array
y modificamos lo siguiente con esto
//echo "<hr> la extension del usuario es $extension y el usuario es admin : $isAdmin<hr>";
if(is_array($arrResult) && $total>0){
foreach($arrResult as $key => $val){
$ext = $val['extension'];
//echo "<hr>la extensiones todas a mirar y ver si es posible verlas es $ext<hr>";
//si esta en el array la extension se la permitimos mostrar
//si es admin metemos todas las extensiones en el array_Extensiones ya que ve todas
if ($isAdmin==1){ $array_extensiones[]=$ext;};//si es admin, metemos cada extension en el bucle dentro para que luego el in_array le de ok
if (in_array($ext,$array_extensiones)){
$arrTmp[0] = $ext;
$arrTmp[1] = $val['user_name'];
$arrTmp[2] = $val['num_incoming_call'];
$arrTmp[3] = $val['num_outgoing_call'];
$arrTmp[4] = "<label style='color: green;' title='{$val['duration_incoming_call']} ".tr('seconds')."'>".$pReportCall->Sec2HHMMSS($val['duration_incoming_call'])."</label>";
$arrTmp[5] = "<label style='color: green;' title='{$val['duration_outgoing_call']} ".tr('seconds')."'>".$pReportCall->Sec2HHMMSS($val['duration_outgoing_call'])."</label>";
$arrTmp[6] = "<a href='javascript: popup_ventana(\"?menu=$module_name&action=graph&rawmode=yes&ext=$ext&dini=$date_ini&dfin=$date_end\");'>".
""._tr('Call Details')."</a>";
$arrData[] = $arrTmp;
};
}
=============================
LUEGO BUSCAMOS
function graphLinks($smarty, $module_name, $local_templates_dir)
{
$getParams = array('ext', 'dini', 'dfin');
foreach ($getParams as $k) if (!isset($GET[$k])) $GET[$k] = '';
$urlEntrantes = construirURL(array(
'module' => $module_name,
'rawmode' => 'yes',
'action' => 'imageTop10Entrantes',
'ext' => $GET['ext'],
'dini' => $GET['dini'],
'dfin' => $GET['dfin'],
));
$urlSalientes = construirURL(array(
'module' => $module_name,
'rawmode' => 'yes',
'action' => 'imageTop10Salientes',
'ext' => $GET['ext'],
'dini' => $GET['dini'],
'dfin' => $GET['dfin'],
));
$sPlantilla = <<<PLANTILLA_GRAPH
<html>
<head><title>Top 10</title></head>
<body>
<table width='100%' border='0' cellspacing='0' cellpadding='0' align='center'>
<tr><td align='center'><img alt='imageTop10Entrantes' src='$urlEntrantes' /></td></tr>
<tr><td align='center'><img alt='imageTop10Salientes' src='$urlSalientes' /></td></tr>
</table>
</body>
</html>
PLANTILLA_GRAPH;
return $sPlantilla;
}
Y REEMPLAZAMOS POR
function graphLinks($smarty, $module_name, $local_templates_dir,$extension,$isAdmin)
{
$getParams = array('ext', 'dini', 'dfin');
//hgmnetwork.com fallo de seguridad 20-08-2018 permite ver cualquier extension pasada por GET revisamos previamente las extensiones del usuario o si es admin
//echo "<hr> extension es $extension y es admin: $isAdmin<hr>";
//hgmnetwork.com obtenemos la extension del usuario realizamos la consulta
//miramos si es admin para que evite revisar las extensiones, admin puede ver todo
$array_extensiones=explode(";",$extension);//pasamos los valores a un array
//echo "<hr> la extension del usuario es $extension y el usuario es admin : $isAdmin y extension_ver es $extension_ver<hr>";
//echo "<hr> la extension a mostrar es ".$_GET['ext']." y el usuario puede ver la extension: $extension, y es admin dice $isAdmin<hr>";
//hgmnetwork.com 20-08-2018 - VERIFICAMOS QUE SEA ADMIN O UNA EXTENSION VALIDA
if (in_array($_GET['ext'],$array_extensiones) OR $isAdmin==1){
foreach ($getParams as $k) if (!isset($_GET[$k])) $_GET[$k] = '';
$urlEntrantes = construirURL(array(
'module' => $module_name,
'rawmode' => 'yes',
'action' => 'imageTop10Entrantes',
'ext' => $_GET['ext'],
'dini' => $_GET['dini'],
'dfin' => $_GET['dfin'],
));
$urlSalientes = construirURL(array(
'module' => $module_name,
'rawmode' => 'yes',
'action' => 'imageTop10Salientes',
'ext' => $_GET['ext'],
'dini' => $_GET['dini'],
'dfin' => $_GET['dfin'],
));
$sPlantilla = <<<PLANTILLA_GRAPH
<html>
<head><title>Top 10</title></head>
<body>
<table width='100%' border='0' cellspacing='0' cellpadding='0' align='center'>
<tr><td align='center'><img alt='imageTop10Entrantes' src='$urlEntrantes' /></td></tr>
<tr><td align='center'><img alt='imageTop10Salientes' src='$urlSalientes' /></td></tr>
</table>
</body>
</html>
PLANTILLA_GRAPH;
return $sPlantilla;
} else {
//hgmnetwork.com 20-08-2018 no autorizado a ver el grafico de esa extension
Header('HTTP/1.1 403 Forbidden');
die("<b>403 ".tr("No estas autorizado a ver este gráfico, la extensión ".$GET['ext'].", No existe o no tienes Acceso.")." </b>");
};//Fin de si esta en el array
}
con esto ya se soluciona
igual se puede mejorar mucho el codigo y demas pero lo he echo rapido .
Espero les sirva!