",
$item_name
);
if ($this->Fields[$item]['readonly']) {
printf(
" %s ",
$item,
$carrier->$item,
$carrier->$item
);
} else {
printf(
"",
$item,
$carrier->$item
);
}
print "
";
}
printf("", $carrier->id);
$this->printFiltersToForm();
$this->printHiddenFormElements();
print <<< END
END;
}
function updateRecord()
{
//print "Updating carrier ...";
if (!$_REQUEST['id_filter']) return;
if (!$carrier = $this->getRecord($_REQUEST['id_filter'])) {
return false;
}
foreach (array_keys($this->Fields) as $item) {
$var_name = $item.'_form';
if ($this->Fields[$item]['type'] == 'integer') {
$carrier->$item = intval($_REQUEST[$var_name]);
} else {
$carrier->$item = trim($_REQUEST[$var_name]);
}
}
$function = array(
'commit' => array(
'name' => 'updateCarrier',
'parameters' => array($carrier),
'logs' => array(
'success' => sprintf('Carrier %d has been updated', $_REQUEST['id_filter'])
)
)
);
$result = $this->SoapEngine->execute($function, $this->html);
dprint_r($result);
return (bool)$result;
}
}
diff --git a/library/NGNPro/Records/DnsRecords.php b/library/NGNPro/Records/DnsRecords.php
index 5d92766..b2e9322 100644
--- a/library/NGNPro/Records/DnsRecords.php
+++ b/library/NGNPro/Records/DnsRecords.php
@@ -1,1481 +1,1477 @@
'Change date',
'type' => 'Type',
'name' => 'Name'
);
var $FieldsReadOnly = array(
'customer',
'reseller'
);
var $Fields = array(
'type' => array('type'=>'string'),
'priority' => array('type'=>'integer'),
'value' => array('type'=>'string'),
'ttl' => array('type'=>'integer')
);
var $recordTypes = array(
'A' => 'IP address',
'AAAA' => 'IP v6 address',
'CNAME' => 'Hostname alias',
'MX' => 'Mail server address',
'SRV' => 'Server resource',
'NS' => 'Name server address',
'NAPTR' => 'Name authority',
'PTR' => 'Reverse IP address',
'TXT' => 'Text',
'LOC' => 'Geo location'
);
var $havePriority = array('MX','SRV','NAPTR');
var $addRecordFunction = 'addRecord';
var $deleteRecordFunction = 'deleteRecord';
var $updateRecordFunction = 'updateRecord';
var $getRecordsFunction = 'getRecords';
var $getRecordFunction = 'getRecord';
var $recordTypesTemplate = array(
'sip2sip' => array(
'name' => 'SIP2SIP infrastructure',
'records' => array(
'naptr1' => array(
'name' => '',
'type' => 'NAPTR',
'priority' => '100',
'ttl' => '600',
'value' => '20 100 "s" "SIP+D2T" "" _sip._tcp'
),
'naptr2' => array(
'name' => '',
'type' => 'NAPTR',
'priority' => '100',
'ttl' => '600',
'value' => '30 100 "s" "SIP+D2U" "" _sip._udp'
),
'naptr3' => array(
'name' => '',
'type' => 'NAPTR',
'priority' => '100',
'ttl' => '600',
'value' => '10 100 "s" "SIPS+D2T" "" _sips._tcp'
),
'srv1' => array(
'name' => '_sip._tcp',
'type' => 'SRV',
'priority' => '100',
'ttl' => '600',
'value' => '100 5060 proxy.sipthor.net'
),
'srv2' => array(
'name' => '_sip._udp',
'type' => 'SRV',
'priority' => '100',
'ttl' => '600',
'value' => '100 5060 proxy.sipthor.net'
),
'srv3' => array(
'name' => '_sips._tcp',
'type' => 'SRV',
'priority' => '100',
'ttl' => '600',
'value' => '100 5061 proxy.sipthor.net'
),
'srv4' => array(
'name' => '_stun._udp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 3478 stun1.sipthor.net'
),
'srv5' => array(
'name' => '_stun._udp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 3478 stun2.sipthor.net'
),
'srv6' => array(
'name' => '_msrps._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 2855 msrprelay.sipthor.net'
),
'txt1' => array(
'name' => 'xcap',
'type' => 'TXT',
'priority' => '10',
'value' => 'https://xcap.sipthor.net/xcap-root'
)
),
),
'siptcp' => array(
'name' => 'SIP - TCP transport',
'records' => array(
'naptr' => array(
'name' => '',
'type' => 'NAPTR',
'priority' => '100',
'ttl' => '3600',
'value' => '10 100 "s" "SIP+D2T" "" _sip._tcp'
),
'srv' => array(
'name' => '_sip._tcp',
'type' => 'SRV',
'priority' => '100',
'ttl' => '3600',
'value' => '100 5060 #VALUE#|10 5060 sip'
)
),
),
'siptls' => array(
'name' => 'SIP - TLS transport',
'records' => array(
'naptr' => array(
'name' => '',
'type' => 'NAPTR',
'priority' => '100',
'ttl' => '3600',
'value' => '20 100 "s" "SIPS+D2T" "" _sips._tcp'
),
'srv' => array(
'name' => '_sips._tcp',
'type' => 'SRV',
'priority' => '100',
'ttl' => '3600',
'value' => '100 5061 #VALUE#|10 5061 sip'
)
)
),
'sipudp' => array(
'name' => 'SIP - UDP transport',
'records' => array(
'naptr' => array(
'name' => '',
'type' => 'NAPTR',
'priority' => '100',
'ttl' => '3600',
'value' => '30 100 "s" "SIP+D2U" "" _sip._udp'
),
'srv' => array(
'name' => '_sip._udp',
'type' => 'SRV',
'priority' => '100',
'ttl' => '3600',
'value' => '100 5060 #VALUE#|10 5060 sip'
)
),
),
'stun' => array(
'name' => 'STUN - NAT mirror',
'records' => array(
'srv' => array(
'name' => '_stun._udp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 3478 #VALUE#|10 3478 stun'
)
),
),
'xmpp-server' => array(
'name' => 'XMPP server-to-server over TCP',
'records' => array(
'srv' => array(
'name' => '_xmpp-server._tcp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 5269 #VALUE#|10 5269 xmpp'
),
'srv1' => array(
'name' => '_jabber._tcp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 5269 #VALUE#|10 5269 xmpp'
)
),
),
'xmpp-client' => array(
'name' => 'XMPP client-to-server over TCP',
'records' => array(
'srv' => array(
'name' => '_xmpp-client._tcp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 5222 #VALUE#|10 5222 xmpp'
)
),
),
'xmpps-server' => array(
'name' => 'XMPP server-to-server over TLS',
'records' => array(
'srv' => array(
'name' => '_xmpps-server._tcp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 5269 #VALUE#|10 5269 xmpp'
),
'srv1' => array(
'name' => '_jabbers._tcp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 5269 #VALUE#|10 5269 xmpp'
)
),
),
'xmpps-client' => array(
'name' => 'XMPP client-to-server over TLS',
'records' => array(
'srv' => array(
'name' => '_xmpps-client._tcp',
'type' => 'SRV',
'priority' => '0',
'value' => '10 5222 #VALUE#|10 5222 xmpp'
)
),
),
'msrp' => array(
'name' => 'MSRP - IM relay',
'records' => array(
'srv' => array(
'name' => '_msrps._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 2855 msrprelay'
)
)
),
'sipthor' => array(
'name' => 'SIP - Thor network',
'records' => array(
'eventserver' => array(
'name' => '_eventserver._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 8000 eventserver'
),
'sipserver' => array(
'name' => '_sip._udp',
'type' => 'SRV',
'priority' => '10',
'value' => '30 5060 proxy'
),
'sipns1' => array(
'name' => 'proxy',
'type' => 'NS',
'value' => 'ns1'
),
'sipns2' => array(
'name' => 'proxy',
'type' => 'NS',
'value' => 'ns2'
),
'sipns3' => array(
'name' => 'proxy',
'type' => 'NS',
'value' => 'ns3'
),
'ngnproserver' => array(
'name' => '_ngnpro._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 9200 ngnpro'
),
'ngnns1' => array(
'name' => 'ngnpro',
'type' => 'NS',
'value' => 'ns1'
),
'ngnns2' => array(
'name' => 'ngnpro',
'type' => 'NS',
'value' => 'ns2'
),
'ngnns3' => array(
'name' => 'ngnpro',
'type' => 'NS',
'value' => 'ns3'
),
'xcapserver' => array(
'name' => '_xcap._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 443 xcap'
),
'xcapns1' => array(
'name' => 'xcap',
'type' => 'NS',
'value' => 'ns1'
),
'xcapns2' => array(
'name' => 'xcap',
'type' => 'NS',
'value' => 'ns2'
),
'xcapns3' => array(
'name' => 'xcap',
'type' => 'NS',
'value' => 'ns3'
),
'msrpserver' => array(
'name' => '_msrps._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 2855 msrprelay'
),
'msrpns1' => array(
'name' => 'msrprelay',
'type' => 'NS',
'value' => 'ns1'
),
'msrpns2' => array(
'name' => 'msrprelay',
'type' => 'NS',
'value' => 'ns2'
),
'msrpns3' => array(
'name' => 'msrprelay',
'type' => 'NS',
'value' => 'ns3'
),
'voicemail' => array(
'name' => '_voicemail._tcp',
'type' => 'SRV',
'priority' => '10',
'value' => '0 9200 voicemail'
),
'vmns1' => array(
'name' => 'voicemail',
'type' => 'NS',
'value' => 'ns1'
),
'vmns2' => array(
'name' => 'voicemail',
'type' => 'NS',
'value' => 'ns2'
),
'vmns3' => array(
'name' => 'voicemail',
'type' => 'NS',
'value' => 'ns3'
)
)
)
);
public function __construct($SoapEngine)
{
dprint("init DnsRecords");
$_name = trim($_REQUEST['name_filter']);
if (strlen($_name) && !strstr($_name, '.') && !strstr($_name, '%')) {
$_name .= '%';
}
if ($this->typeFilter) {
$this->filters = array(
'id' => trim($_REQUEST['id_filter']),
'zone' => trim($_REQUEST['zone_filter']),
'name' => $_name,
'type' => $this->typeFilter,
'value' => trim($_REQUEST['value_filter']),
'owner' => trim($_REQUEST['owner_filter'])
);
} else {
$this->filters = array(
'id' => trim($_REQUEST['id_filter']),
'zone' => trim($_REQUEST['zone_filter']),
'name' => $_name,
'type' => trim($_REQUEST['type_filter']),
'value' => trim($_REQUEST['value_filter']),
'owner' => trim($_REQUEST['owner_filter'])
);
}
parent::__construct($SoapEngine);
$this->getAllowedDomains();
}
function listRecords()
{
$this->showSeachForm();
if ($this->typeFilter) {
$filter = array(
'id' => intval($this->filters['id']),
'zone' => $this->filters['zone'],
'name' => $this->filters['name'],
'type' => $this->typeFilter,
'value' => $this->filters['value'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
} else {
$filter = array(
'id' => intval($this->filters['id']),
'zone' => $this->filters['zone'],
'name' => $this->filters['name'],
'type' => $this->filters['type'],
'value' => $this->filters['value'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
}
// Range
$range = array(
'start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array(
'attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query = array(
'filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action($this->getRecordsFunction);
// Call function
$result = call_user_func_array(array($this->SoapEngine->soapclient, $this->getRecordsFunction), array($Query));
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
$this->rows = $result->total;
if ($this->rows > 1 && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') {
$this->showActionsForm();
}
print <<< END
$this->rows records found. Click on record id to edit the values.
END;
if ($this->fancy) {
print <<< END
|
Zone owner |
Zone |
Id |
Name |
Type |
Value |
Owner |
Change date |
Actions |
END;
} else {
print <<< END
|
Zone owner |
Zone |
Id |
Name |
Type |
Priority |
Value |
TTL |
Change date |
Actions |
END;
}
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows = $this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->records[$i]) {
break;
}
$record = $result->records[$i];
$index = $this->next+$i+1;
- $_url = $this->url.sprintf(
- "&service=%s&action=Delete&name_filter=%s&zone_filter=%s&id_filter=%s",
- urlencode($this->SoapEngine->service),
- urlencode($record->name),
- urlencode($record->zone),
- urlencode($record->id)
+ $base_url_data = array(
+ 'service' => $this->SoapEngine->service,
+ 'zone_filter' => $record->zone,
+ 'id_filter' => $record->id
);
- if ($this->adminonly) $_url.= sprintf ("&reseller_filter=%s", $record->reseller);
-
- if ($_REQUEST['action'] == 'Delete' &&
- $_REQUEST['id_filter'] == $record->id) {
- $_url .= "&confirm=1";
- $actionText = "Confirm";
- } else {
- $actionText = "Delete";
- }
+ $delete_url_data = array_merge(
+ $base_url_data,
+ array(
+ 'action' => 'Delete',
+ 'name_filter' => $record->name
+ )
+ );
- $_customer_url = $this->url.sprintf(
- "&service=customers@%s&customer_filter=%s",
- urlencode($this->SoapEngine->customer_engine),
- urlencode($record->customer)
+ $record_url_data = array_merge(
+ $base_url_data,
+ array(
+ 'service' => sprintf(
+ '%s@%s',
+ $this->SoapEngine->service,
+ $this->SoapEngine->soapEngine,
+ )
+ )
+ );
+ $zone_url_data = array(
+ 'service' => sprintf('dns_zones@%s', $this->SoapEngine->soapEngine),
+ 'zone_filter' => $record->zone
);
- $_zone_url = $this->url.sprintf(
- "&service=dns_zones@%s&name_filter=%s",
- urlencode($this->SoapEngine->soapEngine),
- urlencode($record->zone)
+ $customer_url_data = array(
+ 'service' => sprintf('customers@%s', $this->SoapEngine->customer_engine),
+ 'customer_filter' => $record->customer
);
if ($this->adminonly) {
- $_zone_url.= sprintf("&reseller_filter=%s", $record->reseller);
+ $delete_url_data['reseller_filter'] = $record->reseller;
+ $zone_url_data['reseller_filter'] = $record->reseller;
+ $record_url_data['reseller_filter'] = $record->reseller;
}
- $_record_url = $this->url.sprintf(
- "&service=%s@%s&zone_filter=%s&id_filter=%s",
- urlencode($this->SoapEngine->service),
- urlencode($this->SoapEngine->soapEngine),
- urlencode($record->zone),
- urlencode($record->id)
- );
+ $_url = $this->buildUrl($delete_url_data);
+ $_zone_url = $this->buildUrl($zone_url_data);
+ $_record_url = $this->buildUrl($record_url_data);
+ $_customer_url = $this->buildUrl($customer_url_data);
- if ($this->adminonly) $_record_url.= sprintf ("&reseller_filter=%s", $record->reseller);
-
- if ($record->owner) {
- $_owner_url = sprintf(
- "%s",
- $this->url,
- urlencode($this->SoapEngine->soapEngine),
- urlencode($record->owner),
- $record->owner
- );
+ if ($_REQUEST['action'] == 'Delete' &&
+ $_REQUEST['id_filter'] == $record->id) {
+ $delete_url_data['confirm'] = 1;
+ $actionText = "Confirm";
} else {
- $_owner_url='';
+ $actionText = "Delete";
}
if ($this->fancy) {
printf(
"
%s |
%s.%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
",
$index,
$_customer_url,
$record->customer,
$record->reseller,
$_zone_url,
$record->zone,
$_record_url,
$record->id,
$record->name,
$record->type,
$record->value,
$record->owner,
$record->changeDate,
$_url,
$actionText
);
} else {
printf(
"
%s |
%s.%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
",
$index,
$_customer_url,
$record->customer,
$record->reseller,
$_zone_url,
$record->zone,
$_record_url,
$record->id,
$record->name,
$record->type,
$record->priority,
$record->value,
$record->ttl,
$record->changeDate,
$_url,
$actionText
);
}
$i++;
}
}
-
print " ";
if ($this->rows == 1) {
$this->showRecord($record);
} else {
$this->showPagination($maxrows);
}
return true;
}
}
function showSeachFormCustom()
{
printf(
"
Record Id
",
$this->filters['id']
);
printf(
"
Name
",
$this->filters['name']
);
if (count($this->allowedDomains) > 0) {
$selected_zone[$this->filters['zone']]='selected';
print "";
} else {
printf(
"
DNS zone
",
$this->filters['zone']
);
}
if ($this->typeFilter) {
printf(
" Type %s",
$this->typeFilter,
$this->typeFilter
);
} else {
$selected_type[$this->filters['type']]='selected';
echo "
";
}
printf(
"
Value
",
$this->filters['value']
);
}
function deleteRecord($dictionary = array())
{
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "Please press on Confirm to confirm the delete. ";
return true;
}
if ($dictionary['id']) {
$id = $dictionary['id'];
} else {
$id = $this->filters['id'];
}
if (!$id) {
print " Missing record id. ";
return false;
}
$function = array(
'commit' => array(
'name' => $this->deleteRecordFunction,
'parameters' => array($id),
'logs' => array('success' => sprintf('DNS record %s has been deleted', $id))
)
);
$zone = $this->filters['zone'];
unset($this->filters);
$this->filters['zone'] = $zone;
$result = $this->SoapEngine->execute($function, $this->html);
return (bool)$result;
}
function showAddForm()
{
/*
if ($this->adminonly) {
if (!$this->filters['reseller']) {
print " To add a new record you must search first for a customer";
return;
}
}
*/
printf("
";
}
function getAllowedDomains()
{
// Filter
$filter = array(
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range = array(
'start' => 0,
'count' => $this->max_zones_selection
);
// Order
$orderBy = array(
'attribute' => 'name',
'direction' => 'ASC'
);
// Compose query
$Query = array(
'filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZones');
$result = $this->SoapEngine->soapclient->getZones($Query);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
if ($result->total > $this->max_zones_selection) return false;
foreach ($result->zones as $zone) {
if (in_array($zone->name, $this->allowedDomains)) continue;
$this->allowedDomains[] = $zone->name;
$seen[$zone->name]++;
}
}
}
function addRecord($dictionary = array())
{
if ($this->typeFilter) {
$type = $this->typeFilter;
} elseif ($dictionary['type']) {
$type = $dictionary['type'];
} else {
$type = trim($_REQUEST['type']);
}
if ($dictionary['name']) {
$name = $dictionary['name'];
} else {
$name = trim($_REQUEST['name']);
}
$name = rtrim($name, ".");
if (preg_match("/^(.+)@(.*)$/", $name, $m)) {
$zone = $m[2];
} else {
if ($dictionary['zone']) {
$zone = $dictionary['zone'];
$this->skipSaveProperties = true;
} elseif ($_REQUEST['zone']) {
$zone = $_REQUEST['zone'];
}
if ($type == 'MBOXFW') {
$name .= '@'.$zone;
}
}
if (!strlen($zone)) {
if ($this->html) {
echo "Error: Missing zone name. ";
}
return false;
}
$this->filters['zone'] = $zone;
if (!strlen($type)) {
if ($this->html) {
echo "Error: Missing record type. ";
}
return false;
}
if ($dictionary['value']) {
$value = $dictionary['value'];
} else {
$value = trim($_REQUEST['value']);
}
$value = rtrim($value, ".");
if ($this->adminonly) {
if ($dictionary['reseller']) {
} elseif ($this->filters['reseller']) {
} else {
if ($this->html) {
print <<< END
Error: Missing reseller, please first search zones for a given reseller
END;
}
return false;
}
}
if ($dictionary['ttl']) {
$ttl = intval($dictionary['ttl']);
} else {
$ttl = intval(trim($_REQUEST['ttl']));
}
if (!$ttl) $ttl=3600;
if ($dictionary['owner']) {
$owner = intval($dictionary['owner']);
} else {
$owner = intval(trim($_REQUEST['owner']));
}
if ($dictionary['priority']) {
$priority = $dictionary['priority'];
} else {
$priority = trim($_REQUEST['priority']);
}
if (in_array($type, array_keys($this->recordTypes))) {
// See RFC 1912 - Section 2.4
if (trim($name).trim($zone) == trim($zone) && $type == 'CNAME') {
printf(
"
Error: CNAME (%s) equal to zone name (%s) is not allowed
",
trim($name).trim($zone),
trim($zone)
);
return false;
}
if (!strlen($value)) {
if ($this->html) {
echo "Error: Missing record value. ";
}
return false;
}
$record = array(
'name' => trim($name),
'zone' => trim($zone),
'type' => $type,
'value' => trim($value),
'owner' => intval($owner),
'ttl' => intval($ttl),
'priority' => intval($priority)
);
if (!$this->skipSaveProperties = true) {
$_p = array(
array(
'name' => 'dns_records_last_zone',
'category' => 'web',
'value' => $_REQUEST['zone'],
'permission' => 'customer'
),
array(
'name' => 'dns_records_last_type',
'category' => 'web',
'value' => "$type",
'permission' => 'customer'
)
);
$this->setCustomerProperties($_p);
}
$function = array(
'commit' => array(
'name' => $this->addRecordFunction,
'parameters' => array($record),
'logs' => array('success' => sprintf('DNS record %s under %s has been added', $name, $zone))
)
);
$result = $this->SoapEngine->execute($function, $this->html);
dprint_r($result);
return (bool)$result;
} elseif (in_array($type, array_keys($this->recordTypesTemplate))) {
$push_notifications_server = $this->getResellerProperty('push_notifications_server_private')
or $this->getResellerProperty('push_notifications_server');
if ($type == "sip2sip" && $push_notifications_server) {
if (preg_match("/^(.*):(\d+);transport=(.*)$/", $push_notifications_server, $m)) {
$push_hostname = $m[1];
$push_port = $m[2];
$push_transport = $m[3];
if ($push_transport == "tls") {
$naptr_type = "_sips._tcp";
$naptr_s = "SIPS+D2T";
} elseif ($push_transport == "tcp") {
$naptr_type = "_sip._tcp";
$naptr_s = "SIP+D2T";
} else {
$naptr_type = "_sip._udp";
$naptr_s = "SIP+D2U";
}
$this->recordTypesTemplate[$type]['records']['push_naptr'] =
array(
'name' => 'push',
'type' => 'NAPTR',
'priority' => '100',
'ttl' => '600',
'value' => sprintf('10 100 "s" "%s" "" %s.push', $naptr_s, $naptr_type)
);
$this->recordTypesTemplate[$type]['records']['push_srv'] =
array(
'name' => sprintf('%s.push', $naptr_type),
'type' => 'SRV',
'priority' => '100',
'ttl' => '600',
'value' => sprintf('100 %d %s', $push_port, $push_hostname)
);
}
}
foreach (array_values($this->recordTypesTemplate[$type]['records']) as $_records) {
$value_new='';
if (strlen($_records['value'])) {
if (preg_match("/^_sip/", $_records['name'])) {
if (!$value) {
$value = $this->getCustomerProperty('dns_records_last_sip_server');
if (!$value) {
$value = $this->getCustomerProperty('sip_proxy');
}
if (!value) {
$value = $this->SoapEngine->default_sip_proxy;
}
$save_new_value = false;
} else {
$save_new_value = true;
}
}
$els = explode("|", $_records['value']);
foreach ($els as $el) {
if (preg_match("/#VALUE#/", $el)) {
if ($value) {
$value_new = preg_replace("/#VALUE#/", $value, $el);
} else {
continue;
}
} else {
$value_new = $el;
}
break;
}
// save value if type sip server
if ($save_new_value && $_records['name'] && preg_match("/^_sip/", $_records['name'])) {
$_p = array(
array(
'name' => 'dns_records_last_sip_server',
'category' => 'web',
'value' => $value,
'permission' => 'customer'
)
);
$this->setCustomerProperties($_p);
}
}
if (!in_array($_records['type'], array_keys($this->recordTypes))) {
continue;
}
$record = array(
'name' => $_records['name'],
'zone' => trim($zone),
'type' => $_records['type'],
'value' => $value_new,
'owner' => intval($owner),
'ttl' => intval($_records['ttl']),
'priority' => intval($_records['priority'])
);
//print_r($record);
$function = array(
'commit' => array(
'name' => $this->addRecordFunction,
'parameters' => array($record),
'logs' => array(
'success' => sprintf('Dns %s record under %s has been added', $_records['type'], $zone)
)
)
);
$result = $this->SoapEngine->execute($function, $this->html);
return (bool)$result;
}
} else {
if ($this->html) {
print "Error: Invalid or missing record type. ";
}
return false;
}
return true;
}
function getRecordKeys()
{
// Filter
$filter = array(
'id' => intval($this->filters['id']),
'zone' => $this->filters['zone'],
'name' => $this->filters['name'],
'type' => $this->filters['type'],
'value' => $this->filters['value'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range = array(
'start' => 0,
'count' => 1000
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array(
'attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query = array(
'filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRecords');
// Call function
$result = $this->SoapEngine->soapclient->getRecords($Query);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
foreach ($result->records as $record) {
$this->selectionKeys[] = array('id' => $record->id);
}
return true;
}
}
function showRecord($record)
{
echo "Record";
printf("";
}
function getRecord($id)
{
// Filter
if (!$id) {
print "Error in getRecord(): Missing record id";
return false;
}
$filter = array('id' => $id);
// Range
$range = array(
'start' => 0,
'count' => 1
);
// Order
$orderBy = array(
'attribute' => 'changeDate',
'direction' => 'DESC'
);
// Compose query
$Query = array(
'filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action($this->getRecordsFunction);
// Call function
$result = call_user_func_array(array($this->SoapEngine->soapclient, $this->getRecordsFunction), array($Query));
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
if ($result->records[0]) {
return $result->records[0];
} else {
return false;
}
}
}
function updateRecord()
{
//print "Updating record ...";
if (!$_REQUEST['id_filter']) return;
if (!$record = $this->getRecord(intval($_REQUEST['id_filter']))) {
return false;
}
$record_old = $record;
foreach (array_keys($this->Fields) as $item) {
$var_name = $item.'_form';
//printf (" %s=%s", $var_name, $_REQUEST[$var_name]);
if ($this->Fields[$item]['type'] == 'integer') {
$record->$item = intval($_REQUEST[$var_name]);
} else {
$record->$item = trim($_REQUEST[$var_name]);
}
}
$function = array('commit' => array('name' => $this->updateRecordFunction,
'parameters' => array($record),
'logs' => array('success' => sprintf('Record %s has been updated', $_REQUEST['id_filter'])))
);
$result = $this->SoapEngine->execute($function, $this->html);
dprint_r($result);
return (bool)$result;
}
function showTextBeforeCustomerSelection()
{
print _("Zone owner");
}
}
diff --git a/library/NGNPro/Records/DnsZones.php b/library/NGNPro/Records/DnsZones.php
index fd2d449..21b38d3 100644
--- a/library/NGNPro/Records/DnsZones.php
+++ b/library/NGNPro/Records/DnsZones.php
@@ -1,904 +1,883 @@
array(
'type'=>'integer',
'help' => 'Zone owner'
)
);
var $Fields = array(
'customer' => array(
'type' => 'integer',
'help' => 'Zone owner'
),
'serial' => array(
'type' => 'integer',
'help' => 'Serial number',
'readonly' => 1
),
'email' => array(
'type' => 'string',
'help' => 'Administrator address'
),
'ttl' => array(
'type' => 'integer',
'help' => 'Time to live of SOA record'
),
'minimum' => array(
'type' => 'integer',
'help' => 'Default time to live period'
),
'retry' => array(
'type' => 'integer',
'help' => 'Retry transfer period'
),
'expire' => array(
'type' => 'integer',
'help' => 'Expire period'
),
'info' => array(
'type' => 'string',
'help' => 'Zone description'
)
);
public function __construct($SoapEngine)
{
dprint("init DnsZones");
$this->filters = array(
'name' => trim($_REQUEST['name_filter']),
'info' => trim($_REQUEST['info_filter'])
);
parent::__construct($SoapEngine);
$this->sortElements = array(
'changeDate' => 'Change date',
'name' => 'Name'
);
$this->Fields['nameservers'] = array(
'type'=>'text',
'name'=>'Name servers',
'help'=>'Authoritative name servers'
);
}
function showAfterEngineSelection()
{
if ($this->SoapEngine->name_servers) {
//printf(" Available name servers: %s", $this->SoapEngine->name_servers);
}
}
function listRecords()
{
$this->showSeachForm();
// Filter
$filter = array(
'name' => $this->filters['name'],
'info' => $this->filters['info'],
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range = array(
'start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query = array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZones');
$result = $this->SoapEngine->soapclient->getZones($Query);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
$this->rows = $result->total;
if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') {
$this->showActionsForm();
}
print <<< END
$this->rows records found
Id |
Owner |
Zone |
Administrator |
Info |
|
Serial |
Default TTL |
Change date |
Actions |
END;
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows = $this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->zones[$i]) break;
$zone = $result->zones[$i];
$base_url_data = array(
'service' => $this->SoapEngine->service,
'name_filter' => $zone->name
);
$delete_url_data = array_merge(
$base_url_data,
array(
'action' => 'Delete'
)
);
$zone_url_data = $base_url_data;
$records_url_data = array(
'service' => sprintf('dns_records@%s', $this->SoapEngine->soapEngine),
'zone_filter' => $zone->name
);
$customer_url_data = array(
'service' => sprintf('customers@%s', $this->SoapEngine->customer_engine),
'customer_filter' => $zone->customer
);
$index = $this->next + $i + 1;
if ($this->adminonly) {
$delete_url_data['reseller_filter'] = $zone->reseller;
$zone_url_data['reseller_filter'] = $zone->reseller;
$records_url_data['reseller_filter'] = $zone->reseller;
}
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['name_filter'] == $zone->name) {
$delete_url_data['confirm'] = 1;
$actionText = "Confirm";
} else {
$actionText = "Delete";
}
-
- $_url = sprintf(
- "%s&%s",
- $this->url,
- http_build_query($delete_url_data)
- );
-
- $zone_url = sprintf(
- "%s&%s",
- $this->url,
- http_build_query($zone_url_data)
- );
-
- $records_url = sprintf(
- "%s&%s",
- $this->url,
- http_build_query($records_url_data)
- );
-
- $customer_url = sprintf(
- "%s&%s",
- $this->url,
- http_build_query($customer_url_data)
- );
-
+ $_url = $this->buildUrl($delete_url_data);
+ $zone_url = $this->buildUrl($zone_url_data);
+ $records_url = $this->buildUrl($records_url_data);
+ $customer_url = $this->buildUrl($customer_url_data);
sort($zone->nameservers);
$ns_text = '';
foreach ($zone->nameservers as $ns) {
$ns_text.= $ns." ";
}
printf(
"
%s |
%s.%s |
%s |
%s |
%s |
Records |
%s |
%s |
%s |
%s |
",
$index,
$customer_url,
$zone->customer,
$zone->reseller,
$zone_url,
$zone->name,
$zone->email,
$zone->info,
$records_url,
$zone->serial,
$zone->ttl,
$zone->changeDate,
$_url,
$actionText
);
print "";
$i++;
}
}
print " ";
if ($this->rows == 1) {
$this->showRecord($zone);
} else {
$this->showPagination($maxrows);
}
return true;
}
}
function deleteRecord($dictionary = array())
{
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "Please press on Confirm to confirm the delete. ";
return true;
}
if (!strlen($this->filters['name'])) {
print " Error: missing Dns zone name ";
return false;
}
$name = $this->filters['name'];
$function = array(
'commit' => array(
'name' => 'deleteZone',
'parameters' => array($name),
'logs' => array(
'success' => sprintf('Dns zone %s has been deleted', $this->filters['name'])
)
)
);
unset($this->filters);
$result = $this->SoapEngine->execute($function, $this->html);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
return true;
}
}
function showAddForm()
{
if ($this->selectionActive) return;
printf(
"
";
}
function addRecord($dictionary = array())
{
$name = trim($_REQUEST['name']);
$info = trim($_REQUEST['info']);
$name_servers = trim($_REQUEST['name_servers']);
if ($_FILES['import_file']['tmp_name']) {
$content = fread(fopen($_FILES['import_file']['tmp_name'], "r"), $_FILES['import_file']['size']);
//print_r($content);
if (!$imported_data = json_decode($content, true)) {
printf("Error: reading imported data. ");
return false;
}
//print_r($imported_data);
if (!in_array('dns_zones', array_keys($imported_data))) {
printf(" Error: Missing zones in imported data. ");
return false;
}
if (!in_array('dns_records', array_keys($imported_data))) {
return false;
printf(" Error: Missing records in imported data. ");
}
foreach ($imported_data['customers'] as $customer) {
// Insert credetials
$this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuth);
$customer['credit'] = floatval($customer['credit']);
$customer['balance'] = floatval($customer['balance']);
// Call function
$this->log_action('addAccount');
$result = $this->SoapEngine->soapclientCustomers->addAccount($customer);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode == 5001) {
$result = $this->SoapEngine->soapclientCustomers->updateCustomer($customer);
if (!$this->checkLogSoapError($result, true, true)) {
printf(' Customer %s has been updated', $customer['id']);
}
} else {
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
syslog(LOG_NOTICE, $log);
printf(" Error: $log");
}
} else {
printf(' Customer %s has been added', $customer['id']);
}
}
$name_servers = array();
foreach ($imported_data['dns_zones'] as $zone) {
flush();
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('addZone');
$result = $this->SoapEngine->soapclient->addZone($zone);
$name_servers[$zone['name']] = $zone['nameservers'];
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode == 7001) {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('updateZone');
$result = $this->SoapEngine->soapclient->updateZone($zone);
if (!$this->checkLogSoapError($result, true, true)) {
printf(' Zone %s has been updated', $zone['name']);
}
} else {
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
syslog(LOG_NOTICE, $log);
printf(" Error: $log");
}
} else {
printf(' Zone %s has been added', $zone['name']);
}
}
$added = 0;
$updated = 0;
foreach ($imported_data['dns_records'] as $record) {
flush();
if (in_array($record['name'], $name_servers[$record['zone']]) && $record['type'] == "A") {
continue;
}
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('addRecord');
$result = $this->SoapEngine->soapclient->addRecord($record);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode == 7003) {
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('updateRecord');
$result = $this->SoapEngine->soapclient->updateRecord($record);
if (!$this->checkLogSoapError($result, true, true)) {
$added += 1;
}
} else {
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
syslog(LOG_NOTICE, $log);
printf(" Error: $log");
}
} else {
$added += 1;
}
}
printf(' %d DNS records added and %d updated', $added, $updated);
return true;
} else {
if (isset($this->SoapEngine->allow_none_local_dns_zones)) {
$allow_none_local_dns_zones = $this->SoapEngine->allow_none_local_dns_zones;
} else {
$allow_none_local_dns_zones = false;
}
if (!strlen($name)) {
printf(" Error: Missing zone name. ");
return false;
}
$lookup1 = dns_get_record($name);
//dprint_r($lookup1);
$ns_array1=explode(" ", trim($this->SoapEngine->name_servers));
if (empty($lookup1) || $allow_none_local_dns_zones) {
$valid = 1;
} else {
$valid = 0;
foreach ($lookup1 as $lrecord) {
if ($lrecord['type'] == 'NS') {
if (in_array($lrecord['target'], $ns_array1)) {
$valid = 1 ;
}
}
}
}
if ($valid==0) {
printf("Error: DNS zone already exists on other server. Please contact our support if you plan to transfer this DNS zone to this system. ");
return false;
}
if (is_numeric($prefix)) {
printf("Error: Numeric zone names are not allowed. Use ENUM port instead. ");
return false;
}
list($customer, $reseller)=$this->customerFromLogin($dictionary);
if (!trim($_REQUEST['ttl'])) {
$ttl=3600;
} else {
$ttl = intval(trim($_REQUEST['ttl']));
}
if ($name_servers) {
$ns_array = explode(" ", trim($name_servers));
} elseif ($this->login_credentials['login_type'] != 'admin' && $this->SoapEngine->name_servers) {
$ns_array = explode(" ", trim($this->SoapEngine->name_servers));
} else {
$ns_array = array();
}
$zone = array(
'name' => $name,
'ttl' => $ttl,
'info' => $info,
'customer' => intval($customer),
'reseller' => intval($reseller),
'nameservers' => $ns_array
);
$function = array('commit' => array('name' => 'addZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('DNS zone %s has been added', $name)))
);
$result = $this->SoapEngine->execute($function, $this->html);
dprint_r($result);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
return true;
}
}
}
function showSeachFormCustom()
{
printf(
"
DNS zone
",
$this->filters['name']
);
printf(
"
Info
",
$this->filters['info']
);
}
function showRecord($zone)
{
print <<< END
END;
printf("";
print "
";
}
function updateRecord()
{
if (!$_REQUEST['name_filter']) return;
//dprintf("Updating zone %s...", $_REQUEST['name_filter']);
$filter = array('name' => $_REQUEST['name_filter']);
if (!$zone = $this->getRecord($filter)) {
return false;
}
$zone_old = $zone;
foreach (array_keys($this->Fields) as $item) {
$var_name = $item.'_form';
//printf(" %s=%s", $var_name, $_REQUEST[$var_name]);
if ($this->Fields[$item]['type'] == 'integer') {
$zone->$item = intval($_REQUEST[$var_name]);
} elseif ($item == 'nameservers') {
$_txt = trim($_REQUEST[$var_name]);
if (!strlen($_txt)) {
unset($zone->$item);
} else {
$_nameservers = array();
$_lines = explode("\n", $_txt);
foreach ($_lines as $_line) {
$_ns = trim($_line);
$_nameservers[] = $_ns;
}
$zone->$item = $_nameservers;
}
} else {
$zone->$item = trim($_REQUEST[$var_name]);
}
}
if ($this->adminonly) {
foreach (array_keys($this->FieldsAdminOnly) as $item) {
$var_name = $item.'_form';
if ($this->FieldsAdminOnly[$item]['type'] == 'integer') {
$zone->$item = intval($_REQUEST[$var_name]);
} else {
$zone->$item = trim($_REQUEST[$var_name]);
}
}
}
$function = array('commit' => array('name' => 'updateZone',
'parameters' => array($zone),
'logs' => array('success' => sprintf('DNS zone %s has been updated', $filter['name'])))
);
$result = $this->SoapEngine->execute($function, $this->html);
dprint_r($result);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
return true;
}
}
function getRecord($zone) {
// Filter
if (!$zone['name']) {
print "Error in getRecord(): Missing zone name";
return false;
}
$filter = array('name' => $zone['name']);
// Range
$range = array('start' => 0,
'count' => 1
);
// Order
$orderBy = array('attribute' => 'changeDate',
'direction' => 'DESC'
);
// Compose query
$Query = array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZones');
$result = $this->SoapEngine->soapclient->getZones($Query);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
if ($result->zones[0]) {
return $result->zones[0];
} else {
return false;
}
}
}
function getRecordKeys()
{
// Filter
$filter = array(
'name' => $this->filters['name'],
'info' => $this->filters['info'],
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range = array(
'start' => 0,
'count' => 200
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array(
'attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query = array(
'filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getZones');
// Call function
$result = $this->SoapEngine->soapclient->getZones($Query);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
foreach ($result->zones as $zone) {
$this->selectionKeys[] = array('name' => $zone->name);
}
return true;
}
}
function hide_html()
{
if ($_REQUEST['action'] == 'PerformActions' && $_REQUEST['sub_action'] == 'export') {
return true;
} else {
return false;
}
}
}
diff --git a/library/NGNPro/Records/EnumMappings.php b/library/NGNPro/Records/EnumMappings.php
index 1ba6b31..4e477c8 100644
--- a/library/NGNPro/Records/EnumMappings.php
+++ b/library/NGNPro/Records/EnumMappings.php
@@ -1,1381 +1,1374 @@
'Change date',
'number' => 'Number',
'tld' => 'TLD'
);
var $ranges = array();
var $FieldsReadOnly = array(
'customer',
'reseller'
);
var $Fields = array(
'owner' => array('type'=>'integer'),
'info' => array('type'=>'string')
);
var $mapping_fields = array(
'id' => 'integer',
'type' => 'string',
'mapto' => 'string',
'priority' => 'integer',
'ttl' => 'integer'
);
var $NAPTR_services = array(
"sip" => array(
"service" => "sip",
"webname" => "SIP",
"schemas" => array("sip:","sips:")),
"mailto" => array(
"service" => "mailto",
"webname" => "Email",
"schemas" => array("mailto:")),
"web:http" => array(
"service" => "web:http",
"webname" => "WEB (http)",
"schemas" => array("http://")),
"web:https" => array(
"service" => "web:https",
"webname" => "WEB (https)",
"schemas" => array("https://")),
"x-skype:callto" => array(
"service" => "x-skype:callto",
"webname" => "Skype",
"schemas" => array("callto:")),
"h323" => array(
"service" => "h323",
"webname" => "H323",
"schemas" => array("h323:")),
"iax" => array(
"service" => "iax",
"webname" => "IAX",
"schemas" => array("iax:")),
"iax2" => array(
"service" => "iax2",
"webname" => "IAX2",
"schemas" => array("iax2:")),
"mms" => array(
"service" => "mms",
"webname" => "MMS",
"schemas" => array("tel:","mailto:")),
"sms" => array(
"service" => "sms",
"webname" => "SMS",
"schemas" => array("tel:","mailto:")),
"ems" => array(
"service" => "ems",
"webname" => "EMS",
"schemas" => array("tel:","mailto:")),
"im" => array(
"service" => "im",
"webname" => "IM",
"schemas" => array("im:")),
"npd:tel" => array(
"service" => "npd+tel",
"webname" => "Portability",
"schemas" => array("tel:")),
"void:mailto" => array(
"service" => "void:mailto",
"webname" => "VOID(mail)",
"schemas" => array("mailto:")),
"void:http" => array(
"service" => "void:http",
"webname" => "VOID(http)",
"schemas" => array("http://")),
"void:https" => array(
"service" => "void:https",
"webname" => "VOID(https)",
"schemas" => array("https://")),
"voice" => array(
"service" => "voice",
"webname" => "Voice",
"schemas" => array("voice:","tel:")),
"tel" => array(
"service" => "tel",
"webname" => "Tel",
"schemas" => array("tel:")),
"fax:tel" => array(
"service" => "fax:tel",
"webname" => "Fax",
"schemas" => array("tel:")),
"ifax:mailto" => array(
"service" => "ifax:mailto",
"webname" => "iFax",
"schemas" => array("mailto:")),
"pres" => array(
"service" => "pres",
"webname" => "Presence",
"schemas" => array("pres:")),
"ft:ftp" => array(
"service" => "ft:ftp",
"webname" => "FTP",
"schemas" => array("ftp://")),
"loc:http" => array(
"service" => "loc:http",
"webname" => "GeoLocation",
"schemas" => array("http://")),
"key:http" => array(
"service" => "key:http",
"webname" => "Public key",
"schemas" => array("http://")),
"key:https" => array(
"service" => "key:https",
"webname" => "Public key (HTTPS)",
"schemas" => array("https://"))
);
public function __construct($SoapEngine)
{
dprint("init EnumMappings");
if ($_REQUEST['range_filter']) {
list($_prefix, $_tld_filter) = explode("@", $_REQUEST['range_filter']);
if ($_prefix && !$_REQUEST['number_filter']) {
$_number_filter = $_prefix.'%';
} else {
$_number_filter = $_REQUEST['number_filter'];
}
} else {
$_number_filter = $_REQUEST['number_filter'];
$_tld_filter = trim($_REQUEST['tld_filter']);
}
$_number_filter = ltrim($_number_filter, '+');
$this->filters = array(
'number' => ltrim($_number_filter, '+'),
'tld' => $_tld_filter,
'range' => trim($_REQUEST['range_filter']),
'type' => trim($_REQUEST['type_filter']),
'mapto' => trim($_REQUEST['mapto_filter']),
'owner' => trim($_REQUEST['owner_filter'])
);
parent::__construct($SoapEngine);
$this->getAllowedDomains();
}
function listRecords()
{
$this->showSeachForm();
$filter = array(
'number' => $this->filters['number'],
'tld' => $this->filters['tld'],
'type' => $this->filters['type'],
'mapto' => $this->filters['mapto'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range = array(
'start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query = array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumbers');
// Call function
$result = $this->SoapEngine->soapclient->getNumbers($Query);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
$this->rows = $result->total;
if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') {
$this->showActionsForm();
}
print "
$this->rows records found
|
Range Owner |
Phone number |
TLD |
Info |
Owner |
Type |
Id |
Map to |
TTL |
Change date |
Actions |
";
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows = $this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->numbers[$i]) break;
$number = $result->numbers[$i];
$index = $this->next+$i+1;
$j=1;
$base_url_data = array(
'service' => $this->SoapEngine->service,
'number_filter' => $number->id->number,
'tld_filter' => $number->id->tld
);
foreach ($number->mappings as $_mapping) {
unset($sip_engine);
foreach (array_keys($this->login_credentials['reseller_filters']) as $_res) {
if ($_res == $number->reseller) {
if ($this->login_credentials['reseller_filters'][$_res]['sip_engine']) {
$sip_engine = $this->login_credentials['reseller_filters'][$_res]['sip_engine'];
break;
}
}
}
if (!$sip_engine) {
if ($this->login_credentials['reseller_filters']['default']['sip_engine']) {
$sip_engine = $this->login_credentials['reseller_filters']['default']['sip_engine'];
} else {
$sip_engine = $this->SoapEngine->sip_engine;
}
}
if (preg_match("/^sip:(.*)$/", $_mapping->mapto, $m) && $this->sip_settings_page) {
$mapto_url_data = array(
'account' => $m[1],
'reseller' => $number->reseller,
'sip_engine' => $sip_engine
);
if ($this->adminonly) {
$mapto_url_data['adminonly'] = $this->adminonly;
}
foreach (array_keys($this->SoapEngine->extraFormElements) as $element) {
if (!strlen($this->SoapEngine->extraFormElements[$element])) continue;
$mapto_url_data[$element] = $this->SoapEngine->extraFormElements[$element];
}
$mapto = sprintf(
"
sip:%s",
$this->sip_settings_page,
http_build_query($mapto_url_data),
$m[1]
);
} else {
$mapto = sprintf("%s", $_mapping->mapto);
}
$delete_url_data = array_merge(
$base_url_data,
array(
'action' => 'Delete',
'mapto_filter' => $_mapping->mapto
)
);
if ($_REQUEST['action'] == 'Delete'
&& $_REQUEST['number_filter'] == $number->id->number
&& $_REQUEST['tld_filter'] == $number->id->tld
&& $_REQUEST['mapto_filter'] == $_mapping->mapto
) {
$delete_url_data['confirm'] = 1;
$actionText = "Confirm";
} else {
$actionText = "Delete";
}
- $_url = sprintf(
- "%s&%s",
- $this->url,
- http_build_query($delete_url_data)
- );
+ $_url = $this->buildUrl($delete_url_data);
+
if ($j==1) {
$number_url_data = $base_url_data;
if ($this->adminonly) $_number_url_data['reseller_filter'] = $number->reseller;
- $_number_url = sprintf(
- "%s&%s",
- $this->url,
- http_build_query($number_url_data)
- );
+ $_number_url = $this->buildUrl($number_url_data);
$_customer_url = sprintf(
's&%s',
$this->url,
http_build_query(
array(
'service' => sprintf('customers@%s', $this->SoapEngine->customer_engine),
'customer_filter' => $number->customer
)
)
);
if ($number->owner) {
$_owner_url = sprintf(
'%s',
$this->url,
http_build_query(
array(
'service' => sprintf('customers@%s', $this->SoapEngine->customer_engine),
'customer_filter' => $number->owner
)
),
$number->owner
);
} else {
$_owner_url='';
}
printf(
"
%s |
%s.%s |
+%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
",
$index,
$_customer_url,
$number->customer,
$number->reseller,
$_number_url,
$number->id->number,
$number->id->tld,
$number->info,
$_owner_url,
ucfirst($_mapping->type),
$_mapping->id,
$mapto,
$_mapping->ttl,
$number->changeDate,
$_url,
$actionText
);
} else {
printf(
"
|
|
|
|
|
|
%s |
%s |
%s |
%s |
%s |
%s |
",
ucfirst($_mapping->type),
$_mapping->id,
$mapto,
$_mapping->ttl,
$number->changeDate,
$_url,
$actionText
);
}
$j++;
}
if (!is_array($number->mappings) || !count($number->mappings)) {
$delete_url_data = array_merge(
$base_url_data,
array(
'action' => 'Delete',
'mapto_filter' => $_mapping->mapto
)
);
if ($_REQUEST['action'] == 'Delete'
&& $_REQUEST['number_filter'] == $number->id->number
&& $_REQUEST['tld_filter'] == $number->id->tld
&& $_REQUEST['mapto_filter'] == $_mapping->mapto
) {
$delete_url_data['confirm'] = 1;
$actionText = "Confirm";
} else {
$actionText = "Delete";
}
$_url = sprintf(
"%s&%s",
$this->url,
http_build_query($delete_url_data)
);
$number_url_data = $base_url_data;
if ($this->adminonly) $_number_url_data['reseller_filter'] = $number->reseller;
$_number_url = sprintf(
"%s&%s",
$this->url,
http_build_query($number_url_data)
);
$_customer_url = sprintf(
's&%s',
$this->url,
http_build_query(
array(
'service' => sprintf('customers@%s', $this->SoapEngine->customer_engine),
'customer_filter' => $number->customer
)
)
);
if ($number->owner) {
$_owner_url = sprintf(
'%s',
$this->url,
http_build_query(
array(
'service' => sprintf('customers@%s', $this->SoapEngine->customer_engine),
'customer_filter' => $number->owner
)
),
$number->owner
);
} else {
$_owner_url='';
}
printf(
"
%s |
%s.%s |
+%s |
%s |
%s |
%s |
|
|
|
%s |
%s |
",
$index,
$_customer_url,
$number->customer,
$number->reseller,
$_number_url,
$number->id->number,
$number->id->tld,
$number->info,
$_owner_url,
$number->changeDate,
$_url,
$actionText
);
}
printf("
");
$i++;
}
}
print " ";
if ($this->rows == 1) {
$this->showRecord($number);
} else {
$this->showPagination($maxrows);
}
return true;
}
}
function getLastNumber()
{
// Filter
$filter = array('number' => ''
);
// Range
$range = array('start' => 0,
'count' => 1
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query = array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumbers');
// Call function
$result = $this->SoapEngine->soapclient->getNumbers($Query);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
if ($result->total) {
$number = array('number' => $result->numbers[0]->id->number,
'tld' => $result->numbers[0]->id->tld,
'mappings' => $result->numbers[0]->mappings
);
return $number;
}
}
return false;
}
function showSeachFormCustom()
{
/*
print " ";
*/
printf(" Number ", $_REQUEST['number_filter']);
printf(" Map to");
print "
";
printf(" ", $this->filters['mapto']);
printf(" Owner ", $this->filters['owner']);
}
function deleteRecord($dictionary = array())
{
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "Please press on Confirm to confirm the delete. ";
return true;
}
if ($dictionary['number']) {
$number = $dictionary['number'];
} else {
$number = $this->filters['number'];
}
if ($dictionary['tld']) {
$tld = $dictionary['tld'];
} else {
$tld = $this->filters['tld'];
}
if ($dictionary['mapto']) {
$mapto = $dictionary['mapto'];
} else {
$mapto = $this->filters['mapto'];
}
if (!strlen($number) || !strlen($tld)) {
print " Error: missing ENUM number or TLD ";
return false;
}
$enum_id = array('number' => $number,
'tld' => $tld
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumber');
$result = $this->SoapEngine->soapclient->getNumber($enum_id);
if (!(new PEAR)->isError($result)) {
// the number exists and we make an update
$result_new = $result;
if (count($result->mappings) > 1) {
foreach ($result->mappings as $_mapping) {
if ($_mapping->mapto != $mapto) {
$mappings_new[] = array('type' => $_mapping->type,
'mapto' => $_mapping->mapto,
'ttl' => $_mapping->ttl,
'priority' => $_mapping->priority,
'id' => $_mapping->id
);
}
}
if (!is_array($mappings_new)) $mappings_new = array();
$result_new->mappings = $mappings_new;
$function = array('commit' => array('name' => 'updateNumber',
'parameters' => array($result_new),
'logs' => array('success' => sprintf('ENUM mapping %s has been deleted',$mapto)))
);
$result = $this->SoapEngine->execute($function, $this->html);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
return true;
}
} else {
$function = array('commit' => array('name' => 'deleteNumber',
'parameters' => array($enum_id),
'logs' => array('success' => sprintf('ENUM number +%s under %s has been deleted',$number, $tld))),
);
$result = $this->SoapEngine->execute($function, $this->html);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
return true;
}
}
unset($this->filters);
} else {
return false;
}
}
function showAddForm()
{
if ($this->selectionActive) return;
//if ($this->adminonly && !$this->filters['reseller']) return;
if (!count($this->ranges)) {
//print " You must create at least one ENUM range before adding ENUM numbers";
return false;
}
printf("
";
}
function getAllowedDomains()
{
// Filter
$filter = array('prefix' => '',
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range = array('start' => 0,
'count' => 200
);
// Order
$orderBy = array('attribute' => 'prefix',
'direction' => 'ASC'
);
// Compose query
$Query = array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRanges');
$result = $this->SoapEngine->soapclient->getRanges($Query);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
foreach ($result->ranges as $range) {
$this->ranges[] = array('prefix' => $range->id->prefix,
'tld' => $range->id->tld,
'minDigits' => $range->minDigits,
'maxDigits' => $range->maxDigits
);
if (in_array($range->id->tld, $this->allowedDomains)) continue;
$this->allowedDomains[] = $range->id->tld;
$seen[$range->id->tld]++;
}
if (!$seen[$this->SoapEngine->default_enum_tld]) {
$this->allowedDomains[] = $this->SoapEngine->default_enum_tld;
}
}
}
function addRecord($dictionary = array()) {
$prefix='';
if ($dictionary['range']) {
list($prefix, $tld)=explode('@', trim($dictionary['range']));
$this->skipSaveProperties = true;
} elseif ($dictionary['tld']) {
$tld = $dictionary['tld'];
} elseif ($_REQUEST['range']) {
list($prefix, $tld)=explode('@', trim($_REQUEST['range']));
} else {
$tld = trim($_REQUEST['tld']);
}
if ($dictionary['number']) {
$number = $dictionary['number'];
} else {
$number = trim($_REQUEST['number']);
}
$number = $prefix.$number;
if (!strlen($tld)) {
$tld = $this->SoapEngine->default_enum_tld;
}
if (!strlen($tld) || !strlen($number) || !is_numeric($number)) {
printf("Error: Missing TLD or number. ");
return false;
}
if ($dictionary['ttl']) {
$ttl = intval($dictionary['ttl']);
} else {
$ttl = intval(trim($_REQUEST['ttl']));
}
if (!$ttl) $ttl=3600;
if ($dictionary['priority']) {
$priority = intval($dictionary['priority']);
} else {
$priority = intval(trim($_REQUEST['priority']));
}
if ($dictionary['owner']) {
$owner = intval($dictionary['owner']);
} else {
$owner = intval(trim($_REQUEST['owner']));
}
if ($dictionary['info']) {
$info = $dictionary['info'];
} else {
$info = trim($_REQUEST['info']);
}
if (!$priority) $priority=5;
$enum_id = array('number' => $number,
'tld' => $tld);
if ($dictionary['mapto']) {
$mapto = $dictionary['mapto'];
} else {
$mapto = trim($_REQUEST['mapto']);
}
if ($dictionary['type']) {
$type = $dictionary['type'];
} else {
$type = trim($_REQUEST['type']);
}
if (preg_match("/^([a-z0-9]+:\/\/)(.*)$/i", $mapto, $m)) {
$_scheme = $m[1];
$_value = $m[2];
} elseif (preg_match("/^([a-z0-9]+:)(.*)$/i", $mapto, $m)) {
$_scheme = $m[1];
$_value = $m[2];
} else {
$_scheme = '';
$_value = $mapto;
}
if (!$_value) {
$lastNumber = $this->getLastNumber();
foreach($lastNumber['mappings'] as $_mapping) {
if ($_mapping->type == trim($type)) {
if (preg_match("/^(.*)@(.*)$/", $_mapping->mapto, $m)) {
$_value = $number.'@'.$m[2];
break;
}
}
}
}
if (!$_scheme || !in_array($_scheme, $this->NAPTR_services[trim($type)]['schemas'])) {
$_scheme = $this->NAPTR_services[trim($type)]['schemas'][0];
}
$mapto = $_scheme.$_value;
$enum_number = array('id' => $enum_id,
'owner' => $owner,
'info' => $info,
'mappings' => array(array('type' => $type,
'mapto' => $mapto,
'ttl' => $ttl,
'priority' => $priority
)
)
);
if (!$this->skipSaveProperties = true) {
$_p = array(
array('name' => 'enum_numbers_last_range',
'category' => 'web',
'value' => $_REQUEST['range'],
'permission' => 'customer'
),
array('name' => 'enum_numbers_last_type',
'category' => 'web',
'value' => "$type",
'permission' => 'customer'
),
array('name' => 'enum_numbers_last_number',
'category' => 'web',
'value' => "$number",
'permission' => 'customer'
),
array('name' => 'enum_numbers_last_ttl',
'category' => 'web',
'value' => "$ttl",
'permission' => 'customer'
)
);
$this->setCustomerProperties($_p);
}
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumber');
$result = $this->SoapEngine->soapclient->getNumber($enum_id);
if ((new PEAR)->isError($result)) {
$error_msg = $result->getMessage();
$error_fault = $result->getFault();
$error_code = $result->getCode();
if ($error_fault->detail->exception->errorcode == "3002") {
$function = array('commit' => array('name' => 'addNumber',
'parameters' => array($enum_number),
'logs' => array('success' => sprintf('ENUM number +%s under %s has been added',$number, $tld)))
);
$result = $this->SoapEngine->execute($function, $this->html);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
return true;
}
} else {
$log = sprintf("SOAP request error from %s: %s (%s): %s", $this->SoapEngine->SOAPurl, $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring);
syslog(LOG_NOTICE, $log);
return false;
}
} else {
// the number exists and we make an update
$result_new = $result;
foreach ($result->mappings as $_mapping) {
$mappings_new[] = array('type' => $_mapping->type,
'mapto' => $_mapping->mapto,
'ttl' => $_mapping->ttl,
'priority' => $_mapping->priority,
'id' => $_mapping->id
);
if ($_mapping->mapto == $mapto) {
printf(" Info: ENUM mapping %s for number %s already exists", $mapto, $number);
return $result;
}
}
$mappings_new[] = array('type' => trim($type),
'mapto' => $mapto,
'ttl' => intval(trim($_REQUEST['ttl'])),
'priority'=> intval(trim($_REQUEST['priority'])),
);
// add mapping
$result_new->mappings = $mappings_new;
$function = array('commit' => array('name' => 'updateNumber',
'parameters' => array($result_new),
'logs' => array('success' => sprintf('ENUM number +%s under %s has been updated',$number, $tld)))
);
$result = $this->SoapEngine->execute($function, $this->html);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
return true;
}
}
}
function getRecordKeys()
{
// Filter
$filter = array('number' => $this->filters['number'],
'tld' => $this->filters['tld'],
'type' => $this->filters['type'],
'mapto' => $this->filters['mapto'],
'owner' => intval($this->filters['owner']),
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range = array('start' => 0,
'count' => 1000
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array('attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query = array('filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
// Insert credetials
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumberss');
// Call function
$result = $this->SoapEngine->soapclient->getNumbers($Query);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
foreach ($result->numbers as $number) {
$this->selectionKeys[] = array('number' => $number->id->number,
'tld' => $number->id->tld);
}
return true;
}
}
function showRecord($number)
{
print " ";
print "";
print "";
print "Number";
print " | ";
print "Mappings";
print " | ";
print " ";
print "";
print "";
print "";
printf("
|
|
|
END;
}
function getRecord($enumid)
{
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getNumber');
$result = $this->SoapEngine->soapclient->getNumber($enumid);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
return $result;
}
}
function updateRecord()
{
//print "Updating number ...";
if (!$_REQUEST['number_filter'] || !$_REQUEST['tld_filter']) return;
$enumid = array('number' => $_REQUEST['number_filter'],
'tld' => $_REQUEST['tld_filter']
);
if (!$number = $this->getRecord($enumid)) {
return false;
}
$number_old = $number;
$new_mappings = array();
/*
foreach ($number->mappings as $_mapping) {
foreach (array_keys($this->mapping_fields) as $field) {
if ($this->mapping_fields[$field] == 'integer') {
$new_mapping[$field] = intval($_mapping->$field);
} else {
$new_mapping[$field] = $_mapping->$field;
}
}
$new_mappings[] = $new_mapping;
}
*/
$j=0;
while ($j< count($_REQUEST['mapping_type'])) {
$mapto = $_REQUEST['mapping_mapto'][$j];
$type = $_REQUEST['mapping_type'][$j];
$id = $_REQUEST['mapping_id'][$j];
$ttl = intval($_REQUEST['mapping_ttl'][$j]);
$priority = intval($_REQUEST['mapping_priority'][$j]);
if (!$ttl) $ttl = $this->default_ttl;
if (!$priority) $priority = $this->default_priority;
if (strlen($mapto)) {
if (preg_match("/^([a-z0-9]+:\/\/)(.*)$/i", $mapto, $m)) {
$_scheme = $m[1];
$_value = $m[2];
} elseif (preg_match("/^([a-z0-9]+:)(.*)$/i", $mapto, $m)) {
$_scheme = $m[1];
$_value = $m[2];
} else {
$_scheme = '';
$_value = $mapto;
}
reset($this->NAPTR_services);
if (!$_scheme || !in_array($_scheme, $this->NAPTR_services[trim($type)]['schemas'])) {
$_scheme = $this->NAPTR_services[trim($type)]['schemas'][0];
}
$mapto = $_scheme.$_value;
$new_mappings[] = array( 'type' => $type,
'ttl' => $ttl,
'id' => intval($id),
'mapto' => $mapto,
'priority' => $priority
);
}
$j++;
}
$number->mappings = $new_mappings;
if (!is_array($number->mappings)) $number->mappings = array();
foreach (array_keys($this->Fields) as $item) {
$var_name = $item.'_form';
//printf(" %s=%s", $var_name, $_REQUEST[$var_name]);
if ($this->Fields[$item]['type'] == 'integer') {
$number->$item = intval($_REQUEST[$var_name]);
} else {
$number->$item = trim($_REQUEST[$var_name]);
}
}
//print_r($number);
$function = array('commit' => array('name' => 'updateNumber',
'parameters' => array($number),
'logs' => array('success' => sprintf('ENUM number +%s under %s has been updated',$enumid['number'], $enumid['tld'])))
);
$result = $this->SoapEngine->execute($function, $this->html);
dprint_r($result) ;
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
return true;
}
}
function showTextBeforeCustomerSelection()
{
print _("Range owner");
}
}
diff --git a/library/NGNPro/Records/EnumRanges.php b/library/NGNPro/Records/EnumRanges.php
index 58061c0..c453b1a 100644
--- a/library/NGNPro/Records/EnumRanges.php
+++ b/library/NGNPro/Records/EnumRanges.php
@@ -1,850 +1,843 @@
array(
'type'=>'integer',
'help' => 'Range owner'
)
);
var $Fields = array(
'customer' => array('type'=>'integer',
'help' => 'Range owner'
),
'serial' => array('type'=>'integer',
'help'=>'DNS serial number',
'readonly' => 1
),
'ttl' => array('type'=>'integer',
'help'=>'Cache period in DNS clients'
),
'info' => array('type'=>'string',
'help' =>'Range description'
),
'size' => array('type'=>'integer',
'help'=>'Maximum number of telephone numbers'
),
'minDigits' => array('type'=>'integer',
'help'=>'Minimum number of digits for telephone numbers'
),
'maxDigits' => array('type'=>'integer',
'help'=>'Maximum number of digits for telephone numbers'
)
);
public function __construct($SoapEngine)
{
dprint("init EnumRanges");
$this->filters = array(
'prefix' => trim(ltrim($_REQUEST['prefix_filter']), '+'),
'tld' => trim($_REQUEST['tld_filter']),
'info' => trim($_REQUEST['info_filter'])
);
parent::__construct($SoapEngine);
$this->sortElements = array(
'changeDate' => 'Change date',
'prefix' => 'Prefix',
'tld' => 'TLD'
);
/*
$this->Fields['nameservers'] = array('type'=>'text',
'name'=>'Name servers',
'help'=>'Name servers authoritative for this DNS zone'
);
*/
if ($this->login_credentials['reseller_filters'][$this->reseller]['record_generator']) {
//printf("Engine: %s",$this->SoapEngine->soapEngine);
if (is_array($this->login_credentials['reseller_filters'][$this->reseller]['record_generator'])) {
$_rg = $this->login_credentials['reseller_filters'][$this->reseller]['record_generator'];
if ($_rg[$this->SoapEngine->soapEngine]) {
$this->record_generator = $_rg[$this->SoapEngine->soapEngine];
}
} else {
$this->record_generator = $this->login_credentials['reseller_filters'][$this->reseller]['record_generator'];
}
} elseif (strlen($this->SoapEngine->record_generator)) {
$this->record_generator = $this->SoapEngine->record_generator;
}
}
function listRecords()
{
$this->getAllowedDomains();
$this->showSeachForm();
// Filter
$filter = array(
'prefix' => $this->filters['prefix'],
'tld' => $this->filters['tld'],
'info' => $this->filters['info'],
'customer' => intval($this->filters['customer']),
'reseller' => intval($this->filters['reseller'])
);
// Range
$range = array(
'start' => intval($this->next),
'count' => intval($this->maxrowsperpage)
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array(
'attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query = array(
'filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRanges');
$result = $this->SoapEngine->soapclient->getRanges($Query);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
$this->rows = $result->total;
if ($this->rows && $_REQUEST['action'] != 'PerformActions' && $_REQUEST['action'] != 'Delete') {
$this->showActionsForm();
}
print <<< END
$this->rows records found
Id |
Owner |
Prefix |
TLD |
Serial |
TTL |
Info |
Min |
Max |
Size |
Used |
Change date |
Actions |
END;
if (!$this->next) $this->next=0;
if ($this->rows > $this->maxrowsperpage) {
$maxrows = $this->maxrowsperpage + $this->next;
if ($maxrows > $this->rows) $maxrows = $this->maxrowsperpage;
} else {
$maxrows = $this->rows;
}
$i=0;
if ($this->rows) {
while ($i < $maxrows) {
if (!$result->ranges[$i]) break;
$range = $result->ranges[$i];
$index = $this->next + $i +1;
- $delete_url = array(
+ $base_url_data = array(
'service' => $this->SoapEngine->service,
- 'action' => 'Delete',
'prefix_filter' => $range->id->prefix,
'tld_filter' => $range->id->tld
);
- if ($this->adminonly) $delete_url['reseller_filter'] = $range->reseller;
+ $delete_url_data = array_merge(
+ $base_url_data,
+ array(
+ 'action' => 'Delete'
+ )
+ );
+
+ $range_url_data = $base_url_data;
+
+ if ($this->adminonly) {
+ $delete_url_data['reseller_filter'] = $range->reseller;
+ $range_url_data['reseller_filter'] = $range->reseller;
+ }
if ($_REQUEST['action'] == 'Delete' &&
$_REQUEST['prefix_filter'] == $range->id->prefix &&
$_REQUEST['tld_filter'] == $range->id->tld) {
- $delete_url['confirm'] = 1;
+ $delete_url_data['confirm'] = 1;
$actionText = "Confirm";
} else {
$actionText = "Delete";
}
- $_url = sprintf(
- "%s&%s",
- $this->url,
- http_build_query($delete_url)
- );
-
- $range_url_data = array(
- 'service' => $this->SoapEngine->service,
- 'prefix_filter' => $range->id->prefix,
- 'tld_filter' => $range->id->tld
- );
-
- if ($this->adminonly) {
- $range_url_data['reseller_filter'] = $range->reseller;
- }
+ $_url = $this->buildUrl($delete_url_data)
$range_url = sprintf(
- '%s',
+ '%s',
$this->url,
http_build_query($range_url_data),
$range->id->prefix
);
if ($this->record_generator) {
$generator_url = sprintf(
'+Numbers',
$this->url,
http_build_query(
array(
'generatorId' => $this->record_generator,
'range' => sprintf('%s@%s', $range->id->prefix, $range->id->tld),
'number_length' => $range->maxDigits,
'reseller_filter' => $range->reseller
)
)
);
} else {
$generator_url='';
}
if ($range->size) {
$usage = intval(100 * $range->used / $range->size);
$bar = $this->makebar($usage);
} else {
$bar="";
}
- $_customer_url = sprintf(
- 's&%s',
- $this->url,
- http_build_query(
- array(
- 'service' => sprintf('customers@%s', $this->SoapEngine->customer_engine),
- 'customer_filter' => $range->customer
- )
+ $_customer_url = $this->buildUrl(
+ array(
+ 'service' => sprintf('customers@%s', $this->SoapEngine->customer_engine),
+ 'customer_filter' => $range->customer
)
);
$_nameservers='';
foreach ($range->nameservers as $_ns) {
$_nameservers.= $_ns.' ';
}
printf(
"
%s |
%s.%s |
+%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s |
%s%s |
",
$index,
$_customer_url,
$range->customer,
$range->reseller,
$range_url,
$range->id->tld,
$range->serial,
$range->ttl,
$range->info,
$range->minDigits,
$range->maxDigits,
$range->size,
$range->used,
$bar,
$range->changeDate,
$_url,
$actionText,
$generator_url
);
$i++;
}
}
print " ";
if ($this->rows == 1) {
$this->showRecord($range);
} else {
$this->showPagination($maxrows);
}
return true;
}
}
function deleteRecord($dictionary = array())
{
if (!$dictionary['confirm'] && !$_REQUEST['confirm']) {
print "Please press on Confirm to confirm the delete. ";
return true;
}
if (!strlen($this->filters['prefix']) || !strlen($this->filters['tld'])) {
print " Error: missing ENUM range id ";
return false;
}
$rangeId = array('prefix'=>$this->filters['prefix'],
'tld'=>$this->filters['tld']);
$function = array(
'commit' => array(
'name' => 'deleteRange',
'parameters' => array($rangeId),
'logs' => array(
'success' => sprintf(
'ENUM range +%s under %s has been deleted',
$this->filters['prefix'],
$this->filters['tld']
)
)
)
);
unset($this->filters);
$result = $this->SoapEngine->execute($function, $this->html);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
return true;
}
}
function showAddForm()
{
if ($this->selectionActive) return;
printf("
";
}
function addRecord($dictionary = array())
{
$tld = trim($_REQUEST['tld']);
$prefix = trim($_REQUEST['prefix']);
$size = trim($_REQUEST['size']);
$info = trim($_REQUEST['info']);
if (!strlen($tld)) {
$tld = $this->SoapEngine->default_enum_tld;
}
if (!strlen($tld) || !strlen($prefix) || !is_numeric($prefix)) {
printf("Error: Missing TLD or prefix. ");
return false;
}
if (!$this->adminonly) {
if (in_array($prefix, $this->deniedPrefixes)) {
print " Error: Only an administrator account can create the prefix coresponding to a country code.";
return false;
}
}
list($customer, $reseller)=$this->customerFromLogin($dictionary);
if (!trim($_REQUEST['ttl'])) {
$ttl = 3600;
} else {
$ttl = intval(trim($_REQUEST['ttl']));
}
$range = array(
'id' => array(
'prefix' => $prefix,
'tld' => $tld
),
'ttl' => $ttl,
'info' => $info,
'minDigits' => intval(trim($_REQUEST['minDigits'])),
'maxDigits' => intval(trim($_REQUEST['maxDigits'])),
'size' => intval($size),
'customer' => intval($customer),
'reseller' => intval($reseller)
);
$deleteRange = array(
'prefix'=>$prefix,
'tld'=>$tld
);
$_p = array(
array(
'name' => 'enum_ranges_last_tld',
'category' => 'web',
'value' => "$tld",
'permission' => 'customer'
)
);
$this->setCustomerProperties($_p);
$function = array(
'commit' => array(
'name' => 'addRange',
'parameters' => array($range),
'logs' => array('success' => sprintf('ENUM range +%s under %s has been added', $prefix, $tld))
)
);
$result = $this->SoapEngine->execute($function, $this->html);
dprint_r($result);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
return true;
}
}
function showSeachFormCustom()
{
printf(
"
Prefix
",
$this->filters['prefix']
);
print "TLD";
if (count($this->allowedDomains) > 0) {
$selected_tld[$this->filters['tld']]='selected';
print <<< END
");
} else {
printf("", $this->filters['tld']);
}
printf(
"
Info
",
$this->filters['info']
);
}
function getAllowedDomains()
{
// Filter
$filter = array(
'prefix' => ''
);
// Range
$range = array(
'start' => 0,
'count' => 500
);
// Order
if (!$this->sorting['sortBy']) $this->sorting['sortBy'] = 'changeDate';
if (!$this->sorting['sortOrder']) $this->sorting['sortOrder'] = 'DESC';
$orderBy = array(
'attribute' => $this->sorting['sortBy'],
'direction' => $this->sorting['sortOrder']
);
// Compose query
$Query = array(
'filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRanges');
$result = $this->SoapEngine->soapclient->getRanges($Query);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
foreach ($result->ranges as $range) {
$this->ranges[] = array(
'prefix' => $range->id->prefix,
'tld' => $range->id->tld,
'minDigits' => $range->minDigits,
'maxDigits' => $range->maxDigits
);
if (in_array($range->id->tld, $this->allowedDomains)) continue;
$this->allowedDomains[] = $range->id->tld;
$seen[$range->id->tld]++;
}
if (!$seen[$this->SoapEngine->default_enum_tld]) {
$this->allowedDomains[] = $this->SoapEngine->default_enum_tld;
}
}
}
function showRecord($range)
{
print <<< END
END;
printf("
END;
}
function updateRecord()
{
//print "Updating range ...";
if (!$_REQUEST['prefix_filter'] || !$_REQUEST['tld_filter']) return;
$rangeid = array(
'prefix' => $_REQUEST['prefix_filter'],
'tld' => $_REQUEST['tld_filter']
);
if (!$range = $this->getRecord($rangeid)) {
return false;
}
$range_old = $range;
foreach (array_keys($this->Fields) as $item) {
$var_name = $item.'_form';
//printf(" %s=%s",$var_name, $_REQUEST[$var_name]);
if ($this->Fields[$item]['type'] == 'integer') {
$range->$item = intval($_REQUEST[$var_name]);
} elseif ($item == 'nameservers') {
$_txt = trim($_REQUEST[$var_name]);
if (!strlen($_txt)) {
unset($range->$item);
} else {
$_nameservers = array();
$_lines = explode("\n", $_txt);
foreach ($_lines as $_line) {
$_ns = trim($_line);
$_nameservers[] = $_ns;
}
$range->$item = $_nameservers;
}
} else {
$range->$item = trim($_REQUEST[$var_name]);
}
}
if ($this->adminonly) {
foreach (array_keys($this->FieldsAdminOnly) as $item) {
$var_name = $item.'_form';
if ($this->FieldsAdminOnly[$item]['type'] == 'integer') {
$range->$item = intval($_REQUEST[$var_name]);
} else {
$range->$item = trim($_REQUEST[$var_name]);
}
}
}
$function = array('commit' => array(
'name' => 'updateRange',
'parameters' => array($range),
'logs' => array(
'success' => sprintf('ENUM range +%s under %s has been updated', $rangeid['prefix'], $rangeid['tld'])))
);
$result = $this->SoapEngine->execute($function, $this->html);
dprint_r($result);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
return true;
}
}
function getRecord($rangeid)
{
// Filter
if (!$rangeid['prefix'] || !$rangeid['tld']) {
print "Error in getRecord(): Missing prefix or tld";
return false;
}
$filter = array(
'prefix' => $rangeid['prefix'],
'tld' => $rangeid['tld']
);
// Range
$range = array(
'start' => 0,
'count' => 1
);
// Order
$orderBy = array(
'attribute' => 'changeDate',
'direction' => 'DESC'
);
// Compose query
$Query = array(
'filter' => $filter,
'orderBy' => $orderBy,
'range' => $range
);
$this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth);
$this->log_action('getRanges');
$result = $this->SoapEngine->soapclient->getRanges($Query);
if ($this->checkLogSoapError($result, true)) {
return false;
} else {
if ($result->ranges[0]) {
return $result->ranges[0];
} else {
return false;
}
}
}
}
diff --git a/library/ngnpro_client.php b/library/ngnpro_client.php
index 2ceb461..c8f5c2c 100644
--- a/library/ngnpro_client.php
+++ b/library/ngnpro_client.php
@@ -1,8333 +1,8342 @@
SoapEngine() function
if ($adminonly) {
$login_credentials=array(
'login_type' => 'admin',
'reseller' => $reseller,
'customer' => $customer,
'extra_form_elements' => array()
);
} else {
$login_credentials=array(
'login_type' => 'reseller',
'soap_username' => $soapUsername,
'soap_password' => $soapPassword,
'reseller' => $reseller,
'customer' => $customer,
'extra_form_elements' => array()
);
}
// login_credentials can overwite SoapEngine->ports
$login_credentials['ports']['customers'] = array(
'records_class' => 'Customers',
'name' => 'Login accounts',
'soap_class' => 'WebService_NGNPro_CustomerPort',
'category' => 'general',
'description' => 'Manage login accounts, customer information and properties. Customer id can be assigned to entities like SIP domains and ENUM ranges. Use _ or % to match one or more characters. '
);
require_once("ngnpro_client.phtml");
require("/etc/cdrtool/ngnpro_engines.inc");
$extraFormElements=array();
////////////////////////////////
// How to create a SIP record //
////////////////////////////////
$sip_engine = 'sip_accounts@engine';
$this->SipSoapEngine = new SoapEngine($sip_engine, $soapEngines, $login_credentials);
$_sip_class = $this->SipSoapEngine->records_class;
$this->sipRecords = new $_sip_class($this->SipSoapEngine);
$sipAccount = array('account' => 'user@example.com',
'quota' => $quota,
'prepaid' => $prepaid,
'password' => $password,
'pstn' => true,
'owner' => $owner,
'customer' => $customer,
'reseller' => $reseller
);
$this->sipRecords->addRecord($sipAccount);
////////////////////////////////
// How to create a SIP domain //
////////////////////////////////
$sip_engine = 'sip_accounts@engine';
$this->SipSoapEngine = new SoapEngine($sip_engine, $soapEngines, $login_credentials);
$_sip_class = $this->SipSoapEngine->records_class;
$this->sipRecords = new $_sip_class($this->SipSoapEngine);
$sipDomain = array('domain' => 'example.com',
'customer' => $customer,
'reseller' => $reseller
);
$this->sipRecords->addRecord($sipDomain);
///////////////////////////////
// How to create a SIP alias //
///////////////////////////////
$sip_engine = 'sip_aliases@engine';
$this->SipSoapEngine = new SoapEngine($sip_engine, $soapEngines, $login_credentials);
$_sip_class = $this->SipSoapEngine->records_class;
$this->sipRecords = new $_sip_class($this->SipSoapEngine);
$sipAlias = array('alias' => 'user@example1.com',
'target' => 'user@example2.com',
'owner' => $owner,
'customer' => $customer,
'reseller' => $reseller
);
$this->sipRecords->addRecord($sipAlias);
///////////////////////////////////
// How to create an ENUM mapping //
///////////////////////////////////
$enum_engine = 'enum_numbers@engine';
$this->EnumSoapEngine = new SoapEngine($enum_engine, $soapEngines, $login_credentials);
$_enum_class = $this->EnumSoapEngine->records_class;
$this->enumRecords = new $_enum_class($this->EnumSoapEngine);
$enumMapping = array('tld' => $tld,
'number' => $number,
'type' => 'sip',
'mapto' => 'sip:user@example.com',
'owner' => $owner,
'customer' => $customer,
'reseller' => $reseller
);
$this->enumRecords->addRecord($enumMapping);
*/
class SoapEngine
{
public $version = 1;
public $adminonly = 0;
public $customer = 0;
public $reseller = 0;
public $login_type = 'reseller';
public $allowedPorts = array();
public $timeout = 5;
public $exception = array();
public $result = false;
public $extraFormElements = array();
public $default_enum_tld = 'e164.arpa';
public $default_timezone = 'Europe/Amsterdam';
public $default_sip_proxy = "";
public $default_msrp_relay = "";
public $ports = array(
'sip_accounts' => array(
'records_class' => 'SipAccounts',
'name' => 'SIP accounts',
'soap_class' => 'WebService_NGNPro_SipPort',
'category' => 'sip',
'description' => 'Manage SIP accounts and their settings. Click on the SIP account to access the settings page. Use _ or % to match one or more characters. ',
),
'customers' => array(
'records_class' => 'Customers',
'name' => 'Owner Accounts',
'soap_class' => 'WebService_NGNPro_CustomerPort',
'category' => 'general',
'description' => 'Manage accounts with address information and other properties. SIP domains and ENUM ranges can be assigned to accounts. Use _ or % to match one or more characters. '
),
'sip_domains' => array(
'records_class' => 'SipDomains',
'name' => 'SIP domains',
'soap_class' => 'WebService_NGNPro_SipPort',
'category' => 'sip',
'description' => 'Manage SIP domains (e.g example.com) served by the SIP Proxy. Use _ or % to match one or more characters. '
),
'trusted_peers' => array(
'records_class' => 'TrustedPeers',
'name' => 'Trusted peers',
'soap_class' => 'WebService_NGNPro_SipPort',
'category' => 'sip',
'description' => 'Manage trusted parties that are allowed to route sessions through the SIP proxy without digest authentication. ',
'resellers_only'=> true
),
'enum_numbers' => array(
'records_class' => 'EnumMappings',
'name' => 'ENUM numbers',
'soap_class' => 'WebService_NGNPro_EnumPort',
'category' => 'dns',
'description' => 'Manage E164 numbers used for incoming calls and their mappings (e.g. +31123456789 map to sip:user@example.com). Use _ or % to match one or more characters. '
),
'enum_ranges' => array(
'records_class' => 'EnumRanges',
'name' => 'ENUM ranges',
'soap_class' => 'WebService_NGNPro_EnumPort',
'category' => 'dns',
'description' => 'Manage E164 number ranges that hold individual phone numbers. Use _ or % to match one or more characters. '
),
'dns_zones' => array(
'records_class' => 'DnsZones',
'name' => 'DNS zones',
'soap_class' => 'WebService_NGNPro_DnsPort',
'category' => 'dns',
'description' => 'Manage DNS zones. Use _ or % to match one or more characters. '
),
'dns_records' => array(
'records_class' => 'DnsRecords',
'name' => 'DNS records',
'soap_class' => 'WebService_NGNPro_DnsPort',
'category' => 'dns',
'description' => 'Manage DNS records. Use _ or % to match one or more characters. '
),
'pstn_carriers' => array(
'records_class' => 'Carriers',
'name' => 'PSTN carriers',
'soap_class' => 'WebService_NGNPro_SipPort',
'category' => 'pstn',
'description' => 'Manage outbound carriers for PSTN traffic. Click on Carier to edit its attributes. ',
'resellers_only'=> true
),
'pstn_gateways' => array(
'records_class' => 'Gateways',
'name' => 'PSTN gateways',
'soap_class' => 'WebService_NGNPro_SipPort',
'category' => 'pstn',
'description' => 'Manage outbound PSTN gateways. Click on Gateway to edit its attributes. ',
'resellers_only'=> true
),
'pstn_routes' => array(
'records_class' => 'Routes',
'name' => 'PSTN routes',
'soap_class' => 'WebService_NGNPro_SipPort',
'category' => 'pstn',
'description' => 'Manage outbound PSTN routes. A prefix must be formated as 00+E164, an empty prefix matches all routes. ',
'resellers_only'=> true
),
'gateway_rules' => array(
'records_class' => 'GatewayRules',
'name' => 'PSTN rules',
'soap_class' => 'WebService_NGNPro_SipPort',
'category' => 'pstn',
'description' => 'Manage translation rules for PSTN gateways. Rules are applied against 00+E164 prefix. Click on Rule to edit its attributes. ',
'resellers_only'=> true
),
'email_aliases' => array(
'records_class' => 'EmailAliases',
'name' => 'Email aliases',
'soap_class' => 'WebService_NGNPro_DnsPort',
'category' => 'dns',
'description' => 'Manage email aliases. Use _ or % to match one or more characters. '
),
'url_redirect' => array(
'records_class' => 'UrlRedirect',
'name' => 'URL redirect',
'soap_class' => 'WebService_NGNPro_DnsPort',
'category' => 'dns',
'description' => 'Manage WEB URL redirections. Use _ or % to match one or more characters. '
),
'sip_aliases' => array(
'records_class' => 'SipAliases',
'name' => 'SIP aliases',
'soap_class' => 'WebService_NGNPro_SipPort',
'category' => 'sip',
'description' => 'Manage redirections for SIP addresses e.g. redirect user1@example1.com (alias) to user2@example2.com (target). Use _ or % to match one or more characters. '
)
);
/**
* service is port@engine where:
*
* - port is an available NGNPro service
* - engine is a connection to an NGNPro server
*
* - soapEngines is an array of NGNPro connections and
* settings belonging to them:
*
* $soapEngines = array(
* 'mdns' => array(
* 'name' => 'Managed DNS',
* 'username' => 'soapadmin',
* 'password' => 'passwd',
* 'url' => 'http://example.com:9200/'
* )
* );
*/
public function __construct($service, $soapEngines, $login_credentials = array())
{
$this->login_credentials = &$login_credentials;
if (is_array($this->login_credentials['ports'])) {
$_ports = array();
foreach (array_keys($this->ports) as $_key) {
if (in_array($_key, array_keys($this->login_credentials['ports']))) {
if (strlen($this->login_credentials['ports'][$_key]['records_class'])) {
$_ports[$_key]['records_class'] = $this->login_credentials['ports'][$_key]['records_class'];
} else {
$_ports[$_key]['records_class'] = $this->ports[$_key]['records_class'];
}
if (strlen($this->login_credentials['ports'][$_key]['soap_class'])) {
$_ports[$_key]['soap_class'] = $this->login_credentials['ports'][$_key]['soap_class'];
} else {
$_ports[$_key]['soap_class'] = $this->ports[$_key]['soap_class'];
}
if (strlen($this->login_credentials['ports'][$_key]['name'])) {
$_ports[$_key]['name'] = $this->login_credentials['ports'][$_key]['name'];
} else {
$_ports[$_key]['name'] = $this->ports[$_key]['name'];
}
if (strlen($this->login_credentials['ports'][$_key]['description'])) {
$_ports[$_key]['description'] = $this->login_credentials['ports'][$_key]['description'];
} else {
$_ports[$_key]['description'] = $this->ports[$_key]['description'];
}
} else {
$_ports[$_key] = $this->ports[$_key];
}
}
$this->ports = $_ports;
}
//dprint_r($this->login_credentials);
if ($this->login_credentials['login_type'] == 'admin') $this->adminonly = 1;
if (strlen($this->login_credentials['soap_filter'])) {
$this->soapEngines = $this->getSoapEngineAllowed($soapEngines, $this->login_credentials['soap_filter']);
} else {
$this->soapEngines = $soapEngines;
}
if (is_array($this->soapEngines)) {
$_engines = array_keys($this->soapEngines);
if (!$service) {
// use first engine available
if (is_array($this->allowedPorts) && count($this->allowedPorts[$_engines[0]]) > 0) {
$_ports = $this->allowedPorts[$_engines[0]];
} else {
$_ports = array_keys($this->ports);
}
// default service is:
$service = $_ports[0].'@'.$_engines[0];
}
if (is_array($this->login_credentials['extra_form_elements'])) {
$this->extraFormElements = $this->login_credentials['extra_form_elements'];
}
$this->service = $service;
$_els = explode('@', $this->service);
if (!$_els[1]) {
$this->soapEngine = $_engines[0];
} else {
$this->soapEngine = $_els[1];
}
$this->sip_engine = $this->soapEngine;
if (strlen($this->soapEngines[$this->soapEngine]['version'])) {
$this->version = $this->soapEngines[$this->soapEngine]['version'];
}
$default_port = 'customers';
if (isset($this->allowedPorts[$this->soapEngine]) ? count($this->allowedPorts[$this->soapEngine]) : 0 > 0) {
if (in_array($_els[0], $this->allowedPorts[$this->soapEngine])) {
$this->port = $_els[0];
} else if (in_array($default_port, $this->allowedPorts[$this->soapEngine])) {
$this->port = $default_port;
} else {
// disable some version dependent ports
foreach (array_keys($this->ports) as $_p) {
if (in_array($_p, $this->allowedPorts[$this->soapEngine])) {
$this->port = $_p;
break;
}
}
}
} else {
if ($_els[0]) {
$this->port = $_els[0];
} else {
$this->port = $default_port;
}
}
$this->records_class = $this->ports[$this->port]['records_class'];
$this->soap_class = $this->ports[$this->port]['soap_class'];
$this->service = $this->port.'@'.$this->soapEngine;
foreach (array_keys($this->soapEngines) as $_key) {
$this->skip[$_key] = $this->soapEngines[$_key]['skip'];
if ($this->soapEngines[$_key]['skip_ports']) {
$this->skip_ports[$_key] = $this->soapEngines[$_key]['skip_ports'];
}
}
$this->impersonate = intval($this->soapEngines[$this->soapEngine]['impersonate']);
if ($this->soapEngines[$this->soapEngine]['default_enum_tld']) {
$this->default_enum_tld = $this->soapEngines[$this->soapEngine]['default_enum_tld'];
}
if ($this->soapEngines[$this->soapEngine]['default_timezone']) {
$this->default_timezone = $this->soapEngines[$this->soapEngine]['default_timezone'];
}
if ($this->soapEngines[$this->soapEngine]['sip_proxy']) {
$this->default_sip_proxy = $this->soapEngines[$this->soapEngine]['sip_proxy'];
}
if ($this->soapEngines[$this->soapEngine]['msrp_relay']) {
$this->default_msrp_relay = $this->soapEngines[$this->soapEngine]['msrp_relay'];
}
if ($this->soapEngines[$this->soapEngine]['default_country']) {
$this->default_country = $this->soapEngines[$this->soapEngine]['default_country'];
}
if (strlen($this->soapEngines[$this->soapEngine]['sip_engine'])) {
$this->sip_engine = $this->soapEngines[$this->soapEngine]['sip_engine'];
}
if (strlen($this->soapEngines[$this->soapEngine]['voicemail_engine'])) {
$this->voicemail_engine = $this->soapEngines[$this->soapEngine]['voicemail_engine'];
}
if (strlen($this->login_credentials['customer_engine'])) {
$this->customer_engine = $this->login_credentials['customer_engine'];
} elseif (strlen($this->soapEngines[$this->soapEngine]['customer_engine'])) {
$this->customer_engine = $this->soapEngines[$this->soapEngine]['customer_engine'];
} else {
$this->customer_engine = $this->soapEngine;
}
if (strlen($this->soapEngines[$this->soapEngine]['sip_settings_page'])) {
$this->sip_settings_page = $this->soapEngines[$this->soapEngine]['sip_settings_page'];
}
if (strlen($this->soapEngines[$this->soapEngine]['call_limit'])) {
$this->call_limit = $this->soapEngines[$this->soapEngine]['call_limit'];
}
if (strlen($this->soapEngines[$this->soapEngine]['digest_settings_page'])) {
$this->digest_settings_page = $this->soapEngines[$this->soapEngine]['digest_settings_page'];
}
if (is_array($this->soapEngines[$this->soapEngine]['customer_properties'])) {
$this->customer_properties = $this->soapEngines[$this->soapEngine]['customer_properties'];
}
if (strlen($this->soapEngines[$this->soapEngine]['timeout'])) {
$this->timeout = intval($this->soapEngines[$this->soapEngine]['timeout']);
}
if (strlen($this->soapEngines[$this->soapEngine]['store_clear_text_passwords'])) {
$this->store_clear_text_passwords = $this->soapEngines[$this->soapEngine]['store_clear_text_passwords'];
}
if (strlen($this->soapEngines[$this->soapEngine]['allow_none_local_dns_zones'])) {
$this->allow_none_local_dns_zones = $this->soapEngines[$this->soapEngine]['allow_none_local_dns_zones'];
}
if (strlen($this->login_credentials['record_generator'])) {
$this->record_generator = $this->login_credentials['record_generator'];
} elseif (strlen($this->soapEngines[$this->soapEngine]['record_generator'])) {
$this->record_generator = $this->soapEngines[$this->soapEngine]['record_generator'];
}
if (strlen($this->login_credentials['name_servers'])) {
$this->name_servers = $this->login_credentials['name_servers'];
} elseif (strlen($this->soapEngines[$this->soapEngine]['name_servers'])) {
$this->name_servers = $this->soapEngines[$this->soapEngine]['name_servers'];
}
if (strlen($login_credentials['reseller'])) {
$this->reseller = $login_credentials['reseller'];
} elseif ($this->adminonly && $_REQUEST['reseller_filter']) {
$this->reseller = $_REQUEST['reseller_filter'];
}
if (strlen($login_credentials['customer'])) {
$this->customer = $login_credentials['customer'];
} elseif ($this->adminonly && $_REQUEST['customer_filter']) {
$this->customer = $_REQUEST['customer_filter'];
}
if (strlen($login_credentials['soap_username'])) {
$this->soapUsername=$login_credentials['soap_username'];
$this->SOAPlogin = array(
"username" => $this->soapUsername,
"password" => $login_credentials['soap_password'],
"admin" => false
);
} else {
// use the credentials defined for the soap engine
$this->soapUsername = $this->soapEngines[$this->soapEngine]['username'];
if ($this->customer) {
$this->SOAPlogin = array(
"username" => $this->soapUsername,
"password" => $this->soapEngines[$this->soapEngine]['password'],
"admin" => true,
"impersonate" => intval($this->customer)
);
} else {
$this->SOAPlogin = array(
"username" => $this->soapUsername,
"password" => $this->soapEngines[$this->soapEngine]['password'],
"admin" => true,
"impersonate" => intval($this->reseller)
);
}
$this->SOAPloginAdmin = array(
"username" => $this->soapUsername,
"password" => $this->soapEngines[$this->soapEngine]['password'],
"admin" => true
);
}
$this->SOAPurl = $this->soapEngines[$this->soapEngine]['url'];
$log = sprintf(
" %s at %s as %s ",
$this->soap_class,
$this->SOAPurl,
$this->SOAPurl,
$this->soapUsername
);
dprint($log);
$this->SoapAuth = array('auth', $this->SOAPlogin , 'urn:AGProjects:NGNPro', 0, '');
$this->SoapAuthAdmin = array('auth', $this->SOAPloginAdmin , 'urn:AGProjects:NGNPro', 0, '');
// Instantiate the SOAP client
if (!class_exists($this->soap_class)) return ;
$this->soapclient = new $this->soap_class($this->SOAPurl);
$this->soapclient->setOpt('curl', 'CURLOPT_SSL_VERIFYPEER', 0);
$this->soapclient->setOpt('curl', 'CURLOPT_SSL_VERIFYHOST', 0);
// set the timeout
$this->soapclient->_options['timeout'] = $this->timeout;
if ($this->customer_engine) {
$this->SOAPloginCustomers = array(
"username" => $this->soapEngines[$this->customer_engine]['username'],
"password" => $this->soapEngines[$this->customer_engine]['password'],
"admin" => true,
"impersonate" => intval($this->reseller)
);
$this->SoapAuthCustomers = array('auth', $this->SOAPloginCustomers , 'urn:AGProjects:NGNPro', 0, '');
$this->SOAPurlCustomers = $this->soapEngines[$this->customer_engine]['url'];
$this->soapclientCustomers = new WebService_NGNPro_CustomerPort($this->SOAPurlCustomers);
$this->soapclientCustomers->setOpt('curl', 'CURLOPT_SSL_VERIFYPEER', 0);
$this->soapclientCustomers->setOpt('curl', 'CURLOPT_SSL_VERIFYHOST', 0);
if (strlen($this->soapEngines[$this->customer_engine]['timeout'])) {
$this->soapclientCustomers->_options['timeout'] = intval($this->soapEngines[$this->customer_engine]['timeout']);
} else {
$this->soapclientCustomers->_options['timeout'] = $this->timeout;
}
}
if ($this->voicemail_engine) {
$this->SOAPloginVoicemail = array(
"username" => $this->soapEngines[$this->voicemail_engine]['username'],
"password" => $this->soapEngines[$this->voicemail_engine]['password'],
"admin" => true,
"impersonate" => intval($this->reseller)
);
$this->SoapAuthVoicemail = array('auth', $this->SOAPloginVoicemail , 'urn:AGProjects:NGNPro', 0, '');
$this->SOAPurlVoicemail = $this->soapEngines[$this->voicemail_engine]['url'];
$this->soapclientVoicemail = new WebService_NGNPro_VoicemailPort($this->SOAPurlVoicemail);
$this->soapclientVoicemail->setOpt('curl', 'CURLOPT_SSL_VERIFYPEER', 0);
$this->soapclientVoicemail->setOpt('curl', 'CURLOPT_SSL_VERIFYHOST', 0);
if (strlen($this->soapEngines[$this->voicemail_engine]['timeout'])) {
$this->soapclientVoicemail->_options['timeout'] = intval($this->soapEngines[$this->voicemail_engine]['timeout']);
} else {
$this->soapclientVoicemail->_options['timeout'] = $this->timeout;
}
}
} else {
print "Error: No SOAP credentials defined.";
}
$this->url = $_SERVER['PHP_SELF']."?1=1";
foreach (array_keys($this->extraFormElements) as $element) {
if (!strlen($this->extraFormElements[$element])) continue;
$this->url .= sprintf(
'&%s=%s',
$element,
urlencode($this->extraFormElements[$element])
);
}
$this->support_email = $this->soapEngines[$this->soapEngine]['support_email'];
$this->support_web = $this->soapEngines[$this->soapEngine]['support_web'];
$this->welcome_message = $this->soapEngines[$this->soapEngine]['welcome_message'];
}
/**
* returns a list of allowed engines based on a filter
* the filter format is:
* engine1:port1,port2 engine2 engine3:port1
*/
public function getSoapEngineAllowed($soapEngines, $filter)
{
if (!$filter) {
$soapEngines_checked = $soapEngines;
} else {
$_filter_els = explode(" ", $filter);
foreach (array_keys($soapEngines) as $_engine) {
foreach ($_filter_els as $_filter) {
unset($_allowed_engine);
$_allowed_ports = array();
list($_allowed_engine, $_allowed_ports_els) = explode(":", $_filter);
if ($_allowed_ports_els) {
$_allowed_ports = explode(",", $_allowed_ports_els);
}
if (count($_allowed_ports) == 0) {
$_allowed_ports = array_keys($this->ports);
}
if ($_engine == $_allowed_engine) {
$soapEngines_checked[$_engine] = $soapEngines[$_engine];
$this->allowedPorts[$_engine] = $_allowed_ports;
continue;
}
}
}
}
return $soapEngines_checked;
}
/**
* $function = array(
* 'commit' => array(
* 'name' => 'addAccount',
* 'parameters' => array(
* $param1,
* $param2
* ),
* 'logs' => array(
* 'success' => 'The function was a success',
* 'failure' => 'The function has failed'
* )
* )
* );
*/
public function execute($function, $html = true, $adminonly = false)
{
if (!$function['commit']['name']) {
if ($html) {
print "Error: no function name supplied";
} else {
print "Error: no function name supplied\n";
}
return false;
}
if ($adminonly) {
$this->soapclient->addHeader($this->SoapAuthAdmin);
} else {
$this->soapclient->addHeader($this->SoapAuth);
}
$result = call_user_func_array(
array(
$this->soapclient,
$function['commit']['name']
),
$function['commit']['parameters']
);
if ((new PEAR)->isError($result)) {
$this->error_msg = $result->getMessage();
$this->error_fault = $result->getFault();
$this->error_code = $result->getCode();
$this->exception = $this->error_fault->detail->exception;
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SOAPurl,
$this->error_msg,
$this->error_fault->detail->exception->errorcode,
$this->error_fault->detail->exception->errorstring
);
syslog(LOG_NOTICE, $log);
if ($html) {
$log = sprintf(
"SOAP query failed: %s (%s): %s",
$this->error_msg,
$this->error_fault->detail->exception->errorcode,
$this->error_fault->detail->exception->errorstring
);
print "$log";
}
return false;
} else {
$this->result = $result;
if ($function['commit']['logs']['success']) {
if ($html) {
printf(
" %s \n",
htmlentities($function['commit']['logs']['success'])
);
}
}
if (is_object($result) || strlen($result)) {
return $result;
} else {
return true;
}
}
}
}
class Records
{
public $maxrowsperpage = '20';
public $sip_settings_page = 'sip_settings.phtml';
public $allowedDomains = array();
public $selectionActive = false;
public $selectionKeys = array();
public $resellers = array();
public $customers = array();
public $record_generator = false;
public $customer_properties = array();
public $loginProperties = array();
public $errorMessage = '';
public $html = true;
public $filters = array();
public $selectionActiveExceptions = array();
public function log_action($action = 'Unknown')
{
global $CDRTool;
$location = "Unknown";
$_loc = geoip_record_by_name($_SERVER['REMOTE_ADDR']);
if ($_loc['country_name']) {
$location = $_loc['country_name'];
}
$log = sprintf(
"CDRTool login username=%s, type=%s, impersonate=%s, IP=%s, location=%s, action=%s:%s, script=%s",
$this->login_credentials['username'],
$this->login_credentials['login_type'],
$CDRTool['impersonate'],
$_SERVER['REMOTE_ADDR'],
$location,
$this->SoapEngine->port,
$action,
$_SERVER['PHP_SELF']
);
syslog(LOG_NOTICE, $log);
}
public function soapHasError($result)
{
return (new PEAR)->isError($result);
}
public function checkLogSoapError($result, $syslog = false, $print = false)
{
if (!$this->soapHasError($result)) {
return false;
}
$error_msg = $result->getMessage();
$error_fault= $result->getFault();
$error_code = $result->getCode();
if ($syslog) {
$log = sprintf(
"SOAP request error from %s: %s (%s): %s",
$this->SoapEngine->SOAPurl,
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
syslog(LOG_NOTICE, $log);
if ($print) {
printf(" Error: $log");
}
} else {
printf(
"Error: %s (%s): %s",
$error_msg,
$error_fault->detail->exception->errorcode,
$error_fault->detail->exception->errorstring
);
}
return true;
}
+ public function buildUrl($data)
+ {
+ return sprintf(
+ "%s&%s",
+ $this->url,
+ http_build_query($data)
+ );
+ }
+
public function __construct($SoapEngine)
{
$this->SoapEngine = $SoapEngine;
$this->version = $this->SoapEngine->version;
$this->login_credentials = $this->SoapEngine->login_credentials;
$this->sorting['sortBy'] = trim($_REQUEST['sortBy']);
$this->sorting['sortOrder'] = trim($_REQUEST['sortOrder']);
$this->next = $_REQUEST['next'];
$this->adminonly = $this->SoapEngine->adminonly;
$this->reseller = $this->SoapEngine->reseller;
$this->customer = $this->SoapEngine->customer;
$this->impersonate = $this->SoapEngine->impersonate;
$this->url = $this->SoapEngine->url;
foreach (array_keys($this->filters) as $_filter) {
if (strlen($this->filters[$_filter]) && !in_array($_filter, $this->selectionActiveExceptions)) {
$this->selectionActive = true;
break;
}
}
if ($this->adminonly) {
$this->url .= sprintf('&adminonly=%s', $this->adminonly);
if ($this->login_credentials['reseller']) {
$this->filters['reseller'] = $this->login_credentials['reseller'];
} else {
$this->filters['reseller'] = trim($_REQUEST['reseller_filter']);
}
}
$this->filters['customer'] = trim($_REQUEST['customer_filter']);
//$this->getResellers();
$this->getCustomers();
$this->getLoginAccount();
if (strlen($this->SoapEngine->sip_settings_page)) {
$this->sip_settings_page = $this->SoapEngine->sip_settings_page;
}
if (strlen($this->SoapEngine->digest_settings_page)) {
$this->digest_settings_page = $this->SoapEngine->digest_settings_page;
}
$this->support_email = $this->SoapEngine->support_email;
$this->support_web = $this->SoapEngine->support_web;
}
function showEngineSelection()
{
$selected_soapEngine[$this->SoapEngine->service] =' selected';
$pstn_access = $this->getCustomerProperty('pstn_access');
printf("");
printf(
"",
$this->url
);
}
function showAfterEngineSelection()
{
}
function showCustomerSelection()
{
$this->showCustomerForm();
}
function showResellerSelection()
{
if ($this->adminonly) {
$this->showResellerForm();
} else {
printf("%s", $this->reseller);
}
}
function showPagination($maxrows)
{
$url .= $this->url.'&'.$this->addFiltersToURL().sprintf(
"&service=%s&sortBy=%s&sortOrder=%s",
urlencode($this->SoapEngine->service),
urlencode($this->sorting['sortBy']),
urlencode($this->sorting['sortOrder'])
);
print "
");
}
function showSeachFormCustom()
{
}
function showSeachForm()
{
if ($this->hide_html()) {
return;
}
printf(
"%s",
$this->SoapEngine->ports[$this->SoapEngine->port]['description']
);
printf(
" | | |