diff --git a/library/ngnpro_client.php b/library/ngnpro_client.php index c96c612..1497e0f 100644 --- a/library/ngnpro_client.php +++ b/library/ngnpro_client.php @@ -1,2822 +1,2822 @@ 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( "

", $_SERVER['PHP_SELF'] ); //print " // //"; print(""); $this->showEngineSelection(); $this->showAfterEngineSelection(); print("
Order by"); $this->showSortForm(); print("
"); $this->printHiddenFormElements('skipServiceElement'); print("

"); print("
"); $this->showTextBeforeCustomerSelection(); print(""); $this->showCustomerSelection(); $this->showResellerSelection(); print("
"); $this->showSeachFormCustom(); print("
"); if ($_REQUEST['action'] != 'Delete') $this->showAddForm(); } function listRecords() { } function getRecordKeys() { } function addRecord($dictionary = array()) { } function deleteRecord($dictionary = array()) { } function showSortCaret($sortSearch) { if ($this->sorting['sortBy'] == $sortSearch && $this->sorting['sortOrder'] == 'DESC') { print(''); } else if ($this->sorting['sortBy'] == $sortSearch && $this->sorting['sortOrder'] == 'ASC') { print(''); } } function tel2enum($tel, $tld) { if (strlen($tld) == 0) $tld="e164.arpa"; // transform telephone number in FQDN Enum style domain name if (preg_match("/^[+]?(\d+)$/", $tel, $m)) { $l = strlen($m[1]); $rev_num = ""; $z = 0; while ($z < $l) { $ss = substr($m[1], $z, 1); $enum = $ss.".".$enum; $z++; } preg_match("/^(.*)\.$/", $enum, $m); $enum = $m[1]; $enum = $enum.".$tld."; return($enum); } else { return($tel); } } function showAddForm() { if ($this->selectionActive) return; } function showSortForm() { if (empty($this->sortElements)) { return; } $selected_sortBy[$this->sorting['sortBy']]='selected'; print ""); $selected_sortOrder[$this->sorting['sortOrder']]='selected'; print(""); } function showTimezones($timezone) { if (!$fp = fopen("timezones", "r")) { print _("Failed to open timezone file."); return false; } print ""; fclose($fp); } function printHiddenFormElements($skipServiceElement = '') { if (!$skipServiceElement) { printf("", $this->SoapEngine->service); } if ($this->adminonly) { printf("", $this->adminonly); } if (is_array($this->SoapEngine->extraFormElements)) { foreach (array_keys($this->SoapEngine->extraFormElements) as $element) { if (!strlen($this->SoapEngine->extraFormElements[$element])) continue; printf( "\n", $element, $this->SoapEngine->extraFormElements[$element] ); } } } function getAllowedDomains() { } function showActionsForm() { if (!$this->selectionActive) { return; } $class_name = get_class($this).'Actions'; if (class_exists($class_name)) { $actions = new $class_name($this->SoapEngine, $this->login_credentials); $actions->showActionsForm($this->filters, $this->sorting); } } function executeActions() { $this->showSeachForm(); $this->getRecordKeys(); dprint_r($this->selectionKeys); $class_name=get_class($this).'Actions'; if (class_exists($class_name)) { $actions = new $class_name($this->SoapEngine, $this->login_credentials); $actions->execute( $this->selectionKeys, $_REQUEST['sub_action'], trim($_REQUEST['sub_action_parameter']) ); } } function getCustomers() { if (!$this->SoapEngine->customer_engine) { dprint ("No customer_engine available"); return true; } if (!$this->filters['reseller']) return; // Filter $filter = array('reseller'=>intval($this->filters['reseller'])); $range = array( 'start' => 0, 'count' => 100 ); // Order $orderBy = array( 'attribute' => 'customer', 'direction' => 'ASC' ); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $this->log_action('getCustomers'); // Call function $result = $this->SoapEngine->soapclientCustomers->getCustomers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $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 { if ($result->total > $range['count']) return; if ($range['count'] <= $result->total) { $max = $range['count']; } else { $max = $result->total; } $i = 0; while ($i < $max) { $customer = $result->accounts[$i]; $this->customers[$customer->id] = $customer->firstName.' '.$customer->lastName; $i++; } return true; } } function getResellers() { if (!$this->SoapEngine->customer_engine) { dprint("No customer_engine available"); return true; } if (!$this->adminonly) return; // Filter $filter = array('reseller'=>intval($this->filters['reseller'])); $range = array( 'start' => 0, 'count' => 200 ); // Order $orderBy = array( 'attribute' => 'customer', 'direction' => 'ASC' ); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $this->log_action('getResellers'); // Call function $result = $this->SoapEngine->soapclientCustomers->getResellers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $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 { //if ($result->total > $range['count']) return; if ($range['count'] <= $result->total) { $max = $range['count']; } else { $max = $result->total; } $i = 0; while ($i < $max) { $reseller = $result->accounts[$i]; if (strlen($reseller->organization) && $reseller->organization!= 'N/A') { $this->resellers[$reseller->id] = $reseller->organization; } else { $this->resellers[$reseller->id] = $reseller->firstName.' '.$reseller->lastName; } $i++; } dprint_r($this->resellers); return true; } } function getLoginAccount() { if (!$this->SoapEngine->customer_engine) { dprint("No customer_engine available"); return true; } if (!$this->customer) { //print ("No customer available"); return true; } $filter = array('customer'=>intval($this->customer)); $range = array('start' => 0,'count' => 1); $orderBy = array('attribute' => 'customer','direction' => 'ASC'); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $this->log_action('getResellers'); // Call function $result = $this->SoapEngine->soapclientCustomers->getResellers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $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 { $this->loginAccount = $result->accounts[0]; $this->loginImpersonate = $result->accounts[0]->impersonate; $this->loginProperties = $this->loginAccount->properties; } if ($this->loginAccount->reseller == $this->customer) { $this->resellerProperties = $this->loginProperties; } else { $filter = array('customer' => intval($this->loginAccount->reseller)); $range = array('start' => 0, 'count' => 1); $orderBy = array('attribute' => 'customer', 'direction' => 'ASC'); // Compose query $Query = array( 'filter' => $filter, 'orderBy' => $orderBy, 'range' => $range ); // Insert credetials $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $this->log_action('getResellers'); // Call function $result = $this->SoapEngine->soapclientCustomers->getResellers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $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 { $this->resellerProperties=$result->accounts[0]->properties; } } //dprint_r($this->resellerProperties); } function showCustomerForm($name = 'customer_filter') { if ($this->login_credentials['customer'] != $this->login_credentials['reseller']) { printf(" %s ", $this->login_credentials['customer']); } else { if (count($this->customers)) { $select_customer[$this->filters['customer']]='selected'; printf(""); } else { printf( "", $name, $this->filters['customer'] ); } } } function showResellerForm($name = 'reseller_filter') { if (!$this->adminonly) return; if ($this->login_credentials['reseller']) { printf(" %s ", $this->login_credentials['reseller']); } else { if (count($this->resellers)) { $select_reseller[$this->filters['reseller']] = 'selected'; printf(""); } else { printf( "", $name, $this->filters['reseller'] ); } } } function showTextBeforeCustomerSelection() { print _("Owner"); } function addFiltersToURL() { $url = ''; $j=0; foreach(array_keys($this->filters) as $filter) { if (strlen(trim($this->filters[$filter]))) { if ($j) $url .='&'; $url .= sprintf('%s_filter=%s',$filter,urlencode(trim($this->filters[$filter]))); } $j++; } return $url; } function printFiltersToForm() { foreach(array_keys($this->filters) as $filter) { if (strlen(trim($this->filters[$filter]))) { printf("",$filter,trim($this->filters[$filter])); } } } function getRecord($domain) { } function updateRecord() { } function copyRecord() { } function showRecord($record) { } function RandomString($len = 11) { $alf = array("a","b","c","d","e","f", "h","i","j","k","l","m", "n","p","r","s","t","w", "x","y","1","2","3","4", "5","6","7","8","9"); $i = 0; while ($i < $len) { srand((double)microtime()*1000000); $randval = rand(0, 28); $string = "$string"."$alf[$randval]"; $i++; } return $string; } function RandomNumber($len = 5) { $alf = array("0","1","2","3","4","5", "9","8","7","6"); $i = 0; while ($i < $len) { srand((double)microtime() * 1000000); $randval = rand(0, 9); $string = "$string"."$alf[$randval]"; $i++; } return $string; } function validDomain($domain) { if (!preg_match ("/^[A-Za-z0-9-.]{1,}\.[A-Za-z]{2,}$/", $domain)) { return false; } return true; } function getCarriers() { if (!empty($this->carriers)) { return true; } $Query=array('filter' => array('name'=>''), 'orderBy' => array('attribute' => 'name', 'direction' => 'ASC' ), 'range' => array('start' => 0, 'count' => 1000) ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getCarriers'); $result = $this->SoapEngine->soapclient->getCarriers($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $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 { foreach ($result->carriers as $_carrier) { $this->carriers[$_carrier->id]=$_carrier->name; } } } function getGateways() { if (!empty($this->gateways)) { return true; } $Query=array('filter' => array('name'=>''), 'orderBy' => array('attribute' => 'name', 'direction' => 'ASC' ), 'range' => array('start' => 0, 'count' => 1000) ); $this->SoapEngine->soapclient->addHeader($this->SoapEngine->SoapAuth); $this->log_action('getGateways'); $result = $this->SoapEngine->soapclient->getGateways($Query); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $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 { foreach ($result->gateways as $_gateway) { $this->gateways[$_gateway->id] = sprintf("%s, Carrier %s", $_gateway->name, $_gateway->carrier); } } } function updateBefore() { return true; } function updateAfter($customer, $customer_old) { return true; } function showCustomerTextBox() { print "
Owner"; if ($this->adminonly) { $this->showCustomerForm('customer'); print "
"; $this->showResellerForm('reseller'); print "
"; } else { $this->showCustomerForm('customer'); } } function makebar($w) { $return = "
"; if ($w < 0) $w = 0; if ($w > 100) $w = 100; $width = $w; $extra = 100 - $w; if ($width < 50) { $color = "black"; $return .= "
"; } elseif ($width < 70) { $return .= "
"; } else { $return .= "
"; } $return .="
"; return $return; } function customerFromLogin($dictionary = array()) { if ($this->login_credentials['reseller']) { $reseller = $this->login_credentials['reseller']; if ($dictionary['customer']) { $customer = $dictionary['customer']; } elseif ($_REQUEST['customer']) { $customer = $_REQUEST['customer']; } else { $customer = $this->login_credentials['customer']; } } else { if ($dictionary['reseller']) { $reseller = $dictionary['reseller']; } else { $reseller = trim($_REQUEST['reseller']); } if ($dictionary['customer']) { $customer = $dictionary['customer']; } else { $customer = trim($_REQUEST['customer']); } } if (!$customer) $customer = $reseller; return array(intval($customer),intval($reseller)); } function getCustomerProperties($customer = '') { if (!$customer) $customer=$this->customer; $log=sprintf("getCustomerProperties(%s,engine=%s)",$customer, $this->SoapEngine->customer_engine); dprint($log); if (!$this->SoapEngine->customer_engine) { dprint ("No customer_engine available"); return true; } if (!$customer) { dprint ("No customer available"); return true; } $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $this->log_action('getProperties'); $result = $this->SoapEngine->soapclientCustomers->getProperties(intval($customer)); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $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 { $this->loginProperties=$result; } /* print "
";
         print_r($this->loginProperties);
         print "
"; */ return true; } function setCustomerProperties($properties, $customer = '') { if (!$customer) $customer=$this->customer; $log=sprintf("setCustomerProperties(%s,engine=%s)",$customer, $this->SoapEngine->customer_engine); dprint($log); if (!$this->SoapEngine->customer_engine) { dprint ("No customer_engine available"); return true; } if (!is_array($properties) || !$customer) return true; $this->SoapEngine->soapclientCustomers->addHeader($this->SoapEngine->SoapAuthCustomers); $this->log_action('setProperties'); $result = $this->SoapEngine->soapclientCustomers->setProperties(intval($customer), $properties); if ((new PEAR)->isError($result)) { $error_msg = $result->getMessage(); $error_fault= $result->getFault(); $error_code = $result->getCode(); $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; } return true; } function getCustomerProperty($name = '') { if (empty($this->loginProperties)) { return false; } foreach ($this->loginProperties as $_property) { if ($_property->name == $name) { return $_property->value; } } return false; } function getResellerProperty($name = '') { if (empty($this->resellerProperties)) { return false; } foreach ($this->resellerProperties as $_property) { if ($_property->name == $name) { return $_property->value; } } return false; } function checkRecord($dictionary) { return true; } function showWelcomeMessage() { if (!strlen($this->SoapEngine->welcome_message)) return ; printf ("%s",$this->SoapEngine->welcome_message); } function print_w($obj) { print "
\n";
         print_r($obj);
         print "
\n"; } function hide_html() { return false; } } require_once 'NGNPro/Records/SipDomains.php'; require_once 'NGNPro/Records/SipAccounts.php'; require_once 'NGNPro/Records/SipAliases.php'; require_once 'NGNPro/Records/EnumRanges.php'; require_once 'NGNPro/Records/EnumMappings.php'; require_once 'NGNPro/Records/DnsZones.php'; require_once 'NGNPro/Records/DnsRecords.php'; require_once 'NGNPro/Records/DnsRecords/FancyRecords.php'; require_once 'NGNPro/Records/DnsRecords/FancyRecords/EmailAliases.php'; require_once 'NGNPro/Records/DnsRecords/FancyRecords/UrlRedirect.php'; require_once 'NGNPro/Records/TrustedPeers.php'; require_once 'NGNPro/Records/Carriers.php'; require_once 'NGNPro/Records/Gateways.php'; require_once 'NGNPro/Records/GatewayRules.php'; require_once 'NGNPro/Records/Routes.php'; require_once 'NGNPro/Records/Customers.php'; require_once 'NGNPro/Presence.php'; class recordGenerator extends SoapEngine { //this class generates in bulk enum numbers and sip accounts var $template = array(); var $allowedPorts = array(); var $maxRecords = 500; var $minimum_number_length = 4; var $maximum_number_length = 15; var $default_ip_access_list = ''; var $default_call_limit = ''; function recordGenerator($generatorId,$record_generators,$soapEngines,$login_credentials=array()) { $this->record_generators = $record_generators; $this->generatorId = $generatorId; $this->login_credentials = $login_credentials; //dprint_r($this->login_credentials); $keys = array_keys($this->record_generators); if (!$generatorId) $generatorId=$keys[0]; if (!in_array($generatorId,array_keys($this->record_generators))) { return false; } if (strlen($this->login_credentials['soap_filter'])) { $this->soapEngines = $this->getSoapEngineAllowed($soapEngines,$this->login_credentials['soap_filter']); } else { $this->soapEngines = $soapEngines; } if (in_array($this->record_generators[$generatorId]['sip_engine'],array_keys($this->soapEngines))) { // sip zones if (count($this->allowedPorts[$this->record_generators[$generatorId]['sip_engine']]) > 1 && !in_array('sip_accounts',$this->allowedPorts[$this->record_generators[$generatorId]['sip_engine']])) { // sip port not available dprint("sip port not avaliable"); } else { $sip_engine = 'sip_accounts@'.$this->record_generators[$generatorId]['sip_engine']; $this->SipSoapEngine = new SoapEngine($sip_engine,$soapEngines,$login_credentials); $_sip_class = $this->SipSoapEngine->records_class; $this->sipRecords = new $_sip_class($this->SipSoapEngine); $this->sipRecords->getAllowedDomains(); print_r($this->record_generators[$generatorId]['sip_engine']); if ($this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['ip_access_list']){ $this->default_ip_access_list = $this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['ip_access_list']; } if ($this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['call_limit']){ $this->default_call_limit = $this->soapEngines[$this->record_generators[$generatorId]['sip_engine']]['call_limit']; } } } else { printf ("Error: sip_engine %s does not exist",$this->record_generators[$generatorId]['sip_engine']); } if (in_array($this->record_generators[$generatorId]['enum_engine'],array_keys($this->soapEngines))) { if (count($this->allowedPorts[$this->record_generators[$generatorId]['enum_engine']]) > 1 && !in_array('enum_numbers',$this->allowedPorts[$this->record_generators[$generatorId]['enum_engine']])) { dprint("enum port not avaliable"); // enum port not available } else { // enum mappings $enum_engine = 'enum_numbers@'.$this->record_generators[$generatorId]['enum_engine']; $this->EnumSoapEngine = new SoapEngine($enum_engine,$soapEngines,$login_credentials); $_enum_class = $this->EnumSoapEngine->records_class; $this->enumRecords = new $_enum_class($this->EnumSoapEngine); } } else { printf ("Error: enum_engine %s does not exist",$this->record_generators[$generatorId]['enum_engine']); } if (in_array($this->record_generators[$generatorId]['customer_engine'],array_keys($this->soapEngines))) { if (count($this->allowedPorts[$this->record_generators[$generatorId]['customer_engine']]) > 1 && !in_array('customers',$this->allowedPorts[$this->record_generators[$generatorId]['customer_engine']])) { dprint("customer port not avaliable"); } else { $customer_engine = 'customers@'.$this->record_generators[$generatorId]['customer_engine']; $this->CustomerSoapEngine = new SoapEngine($customer_engine,$soapEngines,$login_credentials); $_customer_class = $this->CustomerSoapEngine->records_class; $this->customerRecords = new $_customer_class($this->CustomerSoapEngine); } } else { printf ("Error: customer_engine %s does not exist",$this->record_generators[$generatorId]['customer_engine']); } if ($_REQUEST['reseller_filter']) $this->template['reseller']=intval($_REQUEST['reseller_filter']); if ($_REQUEST['customer_filter']) $this->template['customer']=intval($_REQUEST['customer_filter']); } function showGeneratorForm() { print "
"; print _("ENUM number generator"); print "
"; print " "; print " "; if ($_REQUEST['add_prefix']) { $add_prefix=$_REQUEST['add_prefix']; } else { $add_prefix = $this->sipRecords->getCustomerProperty('enum_generator_add_prefix'); } print " ",$add_prefix); if ($_REQUEST['number_length']) { $number_length=$_REQUEST['number_length']; } else { $number_length = $this->sipRecords->getCustomerProperty('enum_generator_number_length'); } print " "; if ($_REQUEST['strip_digits']) { $strip_digits=$_REQUEST['strip_digits']; } else if ($strip_digits = $this->sipRecords->getCustomerProperty('enum_generator_strip_digits')) { } else { $strip_digits=0; } print " ",$strip_digits); print " "; print " "; if (count($this->sipRecords->allowedDomains) > 0) { print " "; print " "; print " ",$checked_create_sip); if ($_REQUEST['pstn']) { $checked_pstn='checked'; } else { $checked_pstn=''; } print " ",$checked_pstn); if ($_REQUEST['prepaid']) { $checked_prepaid='checked'; } else { $checked_prepaid=''; } print " ",$checked_prepaid); if ($_REQUEST['rpid_strip_digits']) { $rpid_strip_digits=$_REQUEST['rpid_strip_digits']; } else if ($rpid_strip_digits = $this->sipRecords->getCustomerProperty('enum_generator_rpid_strip_digits')) { } else { $rpid_strip_digits=0; } print " ",$rpid_strip_digits); print " ",$_REQUEST['quota']); print " ",$_REQUEST['password']); if (isset($_REQUEST['call_limit'])) { $call_limit=$_REQUEST['call_limit']; } else { $call_limit = $this->sipRecords->getCustomerProperty('enum_generator_call_limit'); } if (!strlen($call_limit) && strlen($this->default_call_limit)) { $call_limit = $this->default_call_limit; } print " ",$call_limit); if (isset($_REQUEST['ip_access_list'])) { $ip_access_list=$_REQUEST['ip_access_list']; } else { $ip_access_list = $this->sipRecords->getCustomerProperty('enum_generator_ip_access_list'); } if (!$ip_access_list && $this->default_ip_access_list) { $ip_access_list = $this->default_ip_access_list; } print " ",$ip_access_list); } if ($_REQUEST['nr_records']) { $nr_records=$_REQUEST['nr_records']; } else { $nr_records=1; } print " "; print " "; print " "; $this->printHiddenFormElements(); print "
"; print _("ENUM range"); print " "; /* if ($_REQUEST['range']) { $selected_range[$_REQUEST['range']]='selected'; } else if ($_last_range=$this->enumRecords->getCustomerProperty('enum_generator_range')) { $selected_range[$_last_range] = 'selected'; } if (is_array($this->enumRecords->ranges)) { print ""; } */ list($_range['prefix'],$_range['tld'])=explode("@",$_REQUEST['range']); printf ("+%s under %s",$_REQUEST['range'],$_range['prefix'],$_range['tld']); print "
"; print ""; print _("ENUM mapping template"); print ""; print "
"; print _("Add prefix after range:"); printf ("
"; print _("Number length:"); printf ("
",$number_length); print _("SIP domain:"); print " "; if (count($this->sipRecords->allowedDomains) > 0) { if ($_REQUEST['domain']) { $selected_domain[$_REQUEST['domain']]='selected'; } else if ($_last_domain=$this->sipRecords->getCustomerProperty('enum_generator_sip_domain')) { $selected_domain[$_last_domain] = 'selected'; } print " "; } else { print ""; } print " "; print "
"; print _("Strip digits:"); printf ("
"; print _("Owner:"); printf (" ",$_REQUEST['owner']); print "
"; print _("Info:"); printf (" ",$_REQUEST['info']); print "

"; print ""; print _("SIP account template"); print ""; print "
"; print _("Create SIP records"); if ($_REQUEST['create_sip']) { $checked_create_sip='checked'; } else { $checked_create_sip=''; } printf ("
"; print _("PSTN access"); printf ("
"; print _("Prepaid"); printf ("
"; print _("Strip digits from Caller-ID"); printf ("
"; print _("Quota"); printf ("
"; print _("Password"); printf ("
"; print _("PSTN call limit"); printf ("
"; print _("IP access list"); printf ("

"; print ""; print ""; printf (" Number of records: ",$nr_records); print ""; print "

"; print _("Existing records will not be overwritten. "); print "

"; } function checkGenerateRequest() { // check number of records $this->template['create_sip']=trim($_REQUEST['create_sip']); $ip_access_list = preg_replace("/\s+/"," ", $_REQUEST['ip_access_list']); if (strlen($ip_access_list) and !check_ip_access_list(trim($ip_access_list), true)) { printf ("Error: IP access lists must be a space separated list of IP network/mask, example: 10.0.20.40/24"); return false; } $this->template['ip_access_list'] = trim($ip_access_list); if (strlen($_REQUEST['call_limit']) && !is_numeric($_REQUEST['call_limit'])) { printf ("Error: PSTN call limit must be numeric"); return false; } $this->template['call_limit']=$_REQUEST['call_limit']; $this->template['rpid_strip_digits']=intval($_REQUEST['rpid_strip_digits']); $this->template['info']=trim($_REQUEST['info']); $nr_records=trim($_REQUEST['nr_records']); if (!is_numeric($nr_records) || $nr_records < 1 || $nr_records > $this->maxRecords) { printf ("Error: number of records must be a number between 1 and %d",$this->maxRecords); return false; } $this->template['nr_records'] = $nr_records; $number_length=trim($_REQUEST['number_length']); if (!is_numeric($number_length) || $number_length < $this->minimum_number_length || $number_length > $this->maximum_number_length) { printf ("Error: number length must be a number between 4 and 15",$this->minimum_number_length,$this->maximum_number_length); return false; } $this->template['number_length'] = $number_length; $strip_digits=trim($_REQUEST['strip_digits']); if (!is_numeric($strip_digits) || $strip_digits < 0 || $number_length < $strip_digits + 3) { printf ("Error: strip digits + 3 must be smaller then %d",$number_length); return false; } $this->template['strip_digits'] = $strip_digits; // sip domain $domain=trim($_REQUEST['domain']); if (!strlen($domain)) { print "Error: SIP domain is missing"; return false; } $this->template['domain'] = $domain; $add_prefix=trim($_REQUEST['add_prefix']); if (strlen($add_prefix) && !is_numeric($add_prefix)) { print "Error: Add prefix must be numeric"; return false; } $this->template['add_prefix'] = $add_prefix; $owner=trim($_REQUEST['owner']); if (strlen($owner) && !is_numeric($owner)) { print "Error: Owner must be an integer"; return false; } // check ENUM TLD list($rangePrefix,$tld)=explode('@',trim($_REQUEST['range'])); $this->template['range'] = trim($_REQUEST['range']); $this->template['rangePrefix'] = $rangePrefix; $this->template['tld'] = $tld; $this->template['quota'] = intval($_REQUEST['quota']); $this->template['owner'] = intval($owner); $this->template['pstn'] = intval($_REQUEST['pstn']); $this->template['prepaid'] = intval($_REQUEST['prepaid']); $this->template['password'] = trim($_REQUEST['password']); /////////////////////////////////////// // logical checks if (strlen($this->template['add_prefix'])) { $start = $this->template['add_prefix']; } else { $start = 0; } $this->template['digitsAfterRange'] = $this->template['number_length'] - strlen($this->template['rangePrefix']); if ($this->template['number_length'] == strlen($this->template['rangePrefix']) + strlen($this->template['add_prefix'])) { $this->template['firstNumber'] = $this->template['rangePrefix'].$this->template['add_prefix']; $this->template['lastNumber'] = substr($this->template['firstNumber'],0,-1).'9'; $this->template['maxNumbers'] = $this->template['lastNumber'] - $this->template['firstNumber'] + 1; } else { $this->template['firstNumber'] = $this->template['rangePrefix'].str_pad($start,$this->template['digitsAfterRange'],'0'); $this->template['lastNumber'] = sprintf("%.0f", $this->template['firstNumber'] + pow(10,$this->template['digitsAfterRange']-strlen($this->template['add_prefix'])) - 1); $this->template['maxNumbers'] = pow(10,$this->template['digitsAfterRange']-strlen($this->template['add_prefix'])); } dprint_r($this->template); if ($this->template['maxNumbers'] < $this->template['nr_records']) { printf ("Error: Insufficient numbers in range, requested = %d, available = %d",$this->template['nr_records'],$this->template['maxNumbers']); return false; } return true; } function generateRecords() { print "

"; if (!$this->checkGenerateRequest()) { return false; } print "

Generating records

    "; $_p=array( array('name' => 'enum_generator_sip_domain', 'category' => 'web', 'value' => strval($this->template['domain']), 'permission' => 'customer' ), array('name' => 'enum_generator_range', 'category' => 'web', 'value' => strval($this->template['range']), 'permission' => 'customer' ), array('name' => 'enum_generator_strip_digits', 'category' => 'web', 'value' => strval($this->template['strip_digits']), 'permission' => 'customer' ), array('name' => 'enum_generator_number_length', 'category' => 'web', 'value' => strval($this->template['number_length']), 'permission' => 'customer' ), array('name' => 'enum_generator_add_prefix', 'category' => 'web', 'value' => strval($this->template['add_prefix']), 'permission' => 'customer' ), array('name' => 'enum_generator_rpid_strip_digits', 'category' => 'web', 'value' => strval($this->template['rpid_strip_digits']), 'permission' => 'customer' ), array('name' => 'enum_generator_call_limit', 'category' => 'web', 'value' => strval($this->template['call_limit']), 'permission' => 'customer' ), array('name' => 'enum_generator_ip_access_list', 'category' => 'web', 'value' => strval($this->template['ip_access_list']), 'permission' => 'customer' ) ); $this->enumRecords->setCustomerProperties($_p); if ($this->template['owner']) { if ($customer = $this->customerRecords->getRecord($this->template['owner'])) { $this->template['email'] = $customer->email; $this->template['firstName'] = $customer->firstName; $this->template['lastName'] = $customer->lastName; if (!strlen($this->template['info'])) { $this->template['info'] = $customer->firstName.' '.$customer->lastName; } } else { printf ("Error: cannot retrieve customer information for owner %d",$this->template['owner']); } } dprint_r($this->template); $i=0; while ($i < $this->template['nr_records']) { $number = sprintf("%.0f", $this->template['firstNumber'] + $i); $username = substr($number,$this->template['strip_digits']); $mapto = 'sip:'.$username.'@'.$this->template['domain']; print "
  1. "; printf ('Generating number +%s with mapping %s ',$number,$mapto); flush(); $enumMapping = array('tld' => $this->template['tld'], 'number' => $number, 'type' => 'sip', 'mapto' => $mapto, 'info' => $this->template['info'], 'owner' => $this->template['owner'] ); if ($this->template['create_sip']) { if (preg_match("/^0/",$username)) { printf ('SIP accounts starting with 0 are not generated (%s@%s)',$username,$this->template['domain']); continue; } $groups=array(); printf ('and sip account %s@%s ',$username,$this->template['domain']); $ip_access_list = check_ip_access_list($this->template['ip_access_list']); $sipAccount = array('account' => $username.'@'.$this->template['domain'], 'quota' => $this->template['quota'], 'prepaid' => $this->template['prepaid'], 'password' => $this->template['password'], 'groups' => $groups, 'owner' => $this->template['owner'], 'pstn' => $this->template['pstn'], 'ip_access_list' => $ip_access_list, 'call_limit' => $this->template['call_limit'] ); if ($this->template['firstName']) { $sipAccount['fullname'] = $this->template['firstName'].' '.$this->template['lastName']; } if ($this->template['email']) { $sipAccount['email'] = $this->template['email']; } if ($this->template['pstn']) { $strip_rpid=intval($this->template['rpid_strip_digits']); if ($strip_rpid && strlen($number) > $strip_rpid) { $sipAccount['rpid']=substr($number,intval($this->template['rpid_strip_digits'])); } else { $sipAccount['rpid']=$number; } } } else { unset($sipAccount); } dprint_r($sipAccount); if (is_array($enumMapping)) $this->enumRecords->addRecord($enumMapping); if (is_array($sipAccount)) $this->sipRecords->addRecord($sipAccount); $i++; } print "
"; return true; } function printHiddenFormElements () { printf("",$this->generatorId); if ($this->adminonly) { printf("",$this->adminonly); } if ($this->template['customer']) { printf("",$this->template['customer']); } if ($this->template['reseller']) { printf("",$this->template['reseller']); } foreach (array_keys($this->EnumSoapEngine->extraFormElements) as $element) { if (!strlen($this->EnumSoapEngine->extraFormElements[$element])) continue; printf ("\n",$element,$this->EnumSoapEngine->extraFormElements[$element]); } } function getSoapEngineAllowed($soapEngines,$filter) { // filter syntax: // $filter="engine1:port1,port2,port3 engine2 engine3"; // where engine is a connection from ngnpro_engines.inc and // port is valid port from that engine like sip_accounts or enum_numbers $_filter_els=explode(" ",trim($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 ($_engine == $_allowed_engine) { $soapEngines_checked[$_engine]=$soapEngines[$_engine]; $this->allowedPorts[$_engine]=$_allowed_ports; continue; } } } return $soapEngines_checked; } } class Actions { // this class perfom actions on an array of entities returned by selections var $actions = array(); var $version = 1; var $sub_action_parameter_size = 35; var $html = true; function __construct($SoapEngine, $login_credentials) { $this->SoapEngine = $SoapEngine; $this->login_credentials = $login_credentials; $this->version = $this->SoapEngine->version; $this->adminonly = $this->SoapEngine->adminonly; } 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); } function checkLogSoapError($result, $syslog = false) { if (!(new PEAR)->isError($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); } else { printf( "Error: %s (%s): %s", $error_msg, $error_fault->detail->exception->errorcode, $error_fault->detail->exception->errorstring ); } return true; } function execute($selectionKeys, $action, $sub_action_parameter) { } function showActionsForm($filters,$sorting,$hideParameter=false) { if (!count($this->actions)) return; printf ("
",$_SERVER['PHP_SELF']); print "
"; print " "; if ($this->adminonly) { print " adminonly> "; } print ""; if (!$hideParameter) { printf (" ",$this->sub_action_parameter_size); } print "

"; print " Maximum of 500 records

"; foreach (array_keys($filters) as $_filter) { printf ("\n", $_filter,$filters[$_filter]); } foreach (array_keys($sorting) as $_sorting) { printf ("\n", $_sorting,$sorting[$_sorting]); } printf("",$this->SoapEngine->service); foreach (array_keys($this->SoapEngine->extraFormElements) as $element) { if (!strlen($this->SoapEngine->extraFormElements[$element])) continue; printf ("\n",$element,$this->SoapEngine->extraFormElements[$element]); } print "
"; } } require_once 'NGNPro/Actions/SipAccounts.php'; require_once 'NGNPro/Actions/SipAliases.php'; require_once 'NGNPro/Actions/EnumMappings.php'; require_once 'NGNPro/Actions/DnsRecords.php'; require_once 'NGNPro/Actions/DnsZones.php'; require_once 'NGNPro/Actions/Customers.php'; function check_ip_access_list($acl_string, $check=false) { $list=explode(" ",$acl_string); $ip_access_list = array(); foreach ($list as $el) { $els = explode("/",$el); if (count($els) != 2) { if ($check) { return false; } else { continue; } } list($ip,$mask) = $els; if ($mask <0 or $mask > 32) { if ($check) { return false; } else { continue; } } if (!preg_match("/\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}/",$ip)) { if ($check) { return false; } else { continue; } } $ip_access_list[]=array('ip'=>$ip, 'mask'=>intval($mask)); } if ($check) { return true; } else { return $ip_access_list; } } function objectToArray($d) { if (is_object($d)) { // Gets the properties of the given object // with get_object_vars function $d = get_object_vars($d); } if (is_array($d)) { /* * Return array converted to object * Using __FUNCTION__ (Magic constant) * for recursive call */ return array_map(__FUNCTION__, $d); } else { // Return array return $d; } } ?>