Srv Bebeboutik 6c0978166c add modules
2016-01-04 12:49:26 +01:00

761 lines
26 KiB
PHP
Executable File

<?php
/**
* The core of the OpenInviter system
*
* Contains methods and properties used by all
* the OpenInivter plugins
*
* @author OpenInviter
* @version 1.7.6
*/
abstract class openinviter_base
{
protected $session_id;
private $curl;
private $has_errors=false;
private $debug_buffer=array();
public $service;
public $service_user;
public $service_password;
public $settings;
private $messageDelay;
private $maxMessages;
/**
* Execute an XPath query
*
* Executes an XPath query on a HTML bulk,
* extracting either an attribute or the node value
*
* @param string $string_bulk The HTML string the XPath is executed onto
* @param string $query The XPath query that is being evaluated
* @param string $type The target of the query (an attribute or the node value)
* @param string $attribute The attribute's value to be extracted.
* @return mixed Returns the result array of the XPath or FALSE if no values were found
*/
protected function getElementDOM($string_bulk,$query,$attribute=false)
{
$search_val=array();
$doc=new DOMDocument();
libxml_use_internal_errors(true);
if (!empty($string_bulk)) $doc->loadHTML($string_bulk);
else return false;
libxml_use_internal_errors(false);
$xpath=new DOMXPath($doc);$data=$xpath->query($query);
if ($attribute)
foreach ($data as $node)
$search_val[]=$node->getAttribute($attribute);
else
foreach ($data as $node)
$search_val[]=$node->nodeValue;
if (empty($search_val))
return false;
return $search_val;
}
/**
* Extract a substring from a string
*
* Extracts a substring that is found between two
* tokens from a string
*
* @param string $string_to_search The main string that is being processed
* @param string $string_start The start token from which the substring extraction begins
* @param string $string_end The end token where which marks the substring's end
* @return string The substring that is between the start and end tokens
*/
protected function getElementString($string_to_search,$string_start,$string_end)
{
if (strpos($string_to_search,$string_start)===false)
return false;
if (strpos($string_to_search,$string_end)===false)
return false;
$start=strpos($string_to_search,$string_start)+strlen($string_start);$end=strpos($string_to_search,$string_end,$start);
$return=substr($string_to_search,$start,$end-$start);
return $return;
}
/**
* Extracts hidden elements from a HTML bulk
*
* Extracts all the <input type='hidden'> elements
* from a HTML bulk
*
* @param string $string_bulk The HTML bulk from which the fields are extracted
* @return array An array shaped as name=>value of all the <input type='hidden'> fields
*/
protected function getHiddenElements($string_bulk)
{
$post_elements="";
$doc=new DOMDocument();libxml_use_internal_errors(true);if (!empty($string_bulk)) $doc->loadHTML($string_bulk);libxml_use_internal_errors(false);
$xpath=new DOMXPath($doc);$query="//input[@type='hidden']";$data=$xpath->query($query);
foreach($data as $val)
{
$name=$val->getAttribute('name');
$value=$val->getAttribute('value');
$post_elements[(string)$name]=(string)$value;
}
return $post_elements;
}
/**
* Parse a CSV string into an array
*
* Parses the CSV data from a string into an array,
* reading the first line of the bulk as the CSV header
*
* @param string $file The CSV bulk
* @param string $delimiter The character that separates the values of two fields
* @return mixed The array of CSV entries or FALSE if the CSV has no entries
*/
protected function parseCSV($file, $delimiter=',')
{
$expr="/,(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))/";
$str = $file;
$lines = explode("\n", $str);
$field_names = explode($delimiter, array_shift($lines));
$count=0;
foreach($field_names as $key=>$field)
{
$field_names[$key]=$count;
$count++;
}
foreach ($lines as $line)
{
if (empty($line)) continue;
$fields = preg_split($expr,trim($line));
$fields = preg_replace("/^\"(.*)\"$/","$1",$fields);
$_res=array();
foreach ($field_names as $key => $f) $_res[$f] = (isset($fields[$key])?$fields[$key]:false);
$res[] = $_res;
}
if(!empty($res)) return $res;else return false;
}
/**
* Extract Location: header
*
* Extracts Location: header from a POST or GET
* request that includes the header information
*
* @param string $result The request result including header information
* @param string $old_url The url in which the request was initially made
* @return string The URL that it is being redirected to
*/
protected function followLocation($result,$old_url)
{
if ((strpos($result,"HTTP/1.1 3")===false) AND (strpos($result,"HTTP/1.0 3")===false)) return false;
$new_url=trim($this->getElementString($result,"Location: ",PHP_EOL));
if (empty($new_url)) $new_url=trim($this->getElementString($result,"location: ",PHP_EOL));
if (!empty($new_url))
if (strpos($new_url,'http')===false)
{
$temp=parse_url($old_url);
$new_url=$temp['scheme'].'://'.$temp['host'].($new_url[0]=='/'?'':'/').$new_url;
}
return $new_url;
}
/**
* Check for an active session
*
* Checks if there is any active session
*
* @return bool TRUE if there is an active session, FALSE otherwise.
*/
protected function checkSession()
{
return (empty($this->session_id)?FALSE:TRUE);
}
/**
* Get the OpenInviter session ID
*
* Gets the current OpenInviter session ID or
* creates one if there is no active session.
*
* @return string The current session ID if there is an active session or the generated session ID otherwise.
*/
public function getSessionID()
{
return (empty($this->session_id)?time().'.'.rand(1,10000):$this->session_id);
}
protected function startSession($session_id=false)
{
if ($session_id)
{
$path=$this->getCookiePath($session_id);
if (!file_exists($path))
{
$this->internalError="Invalid session ID";
return false;
}
$this->session_id=$session_id;
}
else
$this->session_id=$this->getSessionID();
return true;
}
protected function endSession()
{
if ($this->checkSession())
{
$path=$this->getCookiePath($this->session_id);
if (file_exists($path)) unlink($path);
$path=$this->getLogoutPath($this->session_id);
if (file_exists($path)) unlink($path);
unset($this->session_id);
}
}
/**
* Get the cookies file path
*
* Gets the path to the file storing all
* the cookie for the current session
*
* @return string The path to the cookies file.
*/
protected function getCookiePath($session_id=false)
{
if ($session_id) $path=$this->settings['cookie_path'].DIRECTORY_SEPARATOR.'oi.'.$session_id.'.cookie';
else $path=$this->settings['cookie_path'].DIRECTORY_SEPARATOR.'oi.'.$this->getSessionID().'.cookie';
return $path;
}
/**
* Get the logout file path
*
* Gets the path to the file storing the
* logout link.
*
* @return string The path to the file storing the logout link.
*/
protected function getLogoutPath($session_id=false)
{
if ($session_id) $path=$this->settings['cookie_path'].DIRECTORY_SEPARATOR.'oi.'.$session_id.'.logout';
else $path=$this->settings['cookie_path'].DIRECTORY_SEPARATOR.'oi.'.$this->getSessionID().'.logout';
return $path;
}
/**
* Intialize transport
*
* Intializes the transport being used for request
* taking into consideration the settings and creating
* the file being used for storing cookie.
*
* @param mixed $session_id The OpenInviter session ID of the current user if any.
*/
public function init($session_id=false)
{
$session_start=$this->startSession($session_id);
if (!$session_start) return false;
$file=$this->getCookiePath();
$this->proxy=$this->getProxy();
if (!$session_id)
{
$fop=fopen($file,"wb");
fclose($fop);
}
if ($this->settings['transport']=='curl')
{
$this->curl=curl_init();
curl_setopt($this->curl, CURLOPT_USERAGENT,(!empty($this->userAgent)?$this->userAgent:"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1"));
curl_setopt($this->curl, CURLOPT_FOLLOWLOCATION, false);
curl_setopt($this->curl, CURLOPT_COOKIEFILE,$file);
curl_setopt($this->curl, CURLOPT_HEADER, false);
curl_setopt($this->curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($this->curl, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($this->curl, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_0);
curl_setopt($this->curl, CURLOPT_RETURNTRANSFER,true);
curl_setopt($this->curl, CURLOPT_COOKIEJAR, $file);
if (strtoupper (substr(PHP_OS, 0,3))== 'WIN') curl_setopt($this->curl, CURLOPT_CONNECTTIMEOUT, (isset($this->timeout)?$this->timeout:5)/2);
else curl_setopt($this->curl, CURLOPT_TIMEOUT, (isset($this->timeout)?$this->timeout:5));
curl_setopt($this->curl, CURLOPT_AUTOREFERER, TRUE);
if ($this->proxy)
{
curl_setopt($this->curl, CURLOPT_PROXY, $this->proxy['host']);
curl_setopt($this->curl, CURLOPT_PROXYPORT, $this->proxy['port']);
if (!empty($this->proxy['user']))
curl_setopt($this->curl, CURLOPT_PROXYUSERPWD, $this->proxy['user'].':'.$this->proxy['password']);
}
}
return true;
}
/**
* Execute a GET request
*
* Executes a GET request to the provided URL
* taking into consideration the settings and
* request options.
*
* @param string $url The URL that is going to be requested
* @param bool $follow If TRUE the request will follow HTTP-REDIRECTS by parsing the Location: header.
* @param bool $header If TRUE the returned value will also contain the received header information of the request
* @param bool $quiet If FALSE it will output detailed request header information
* @param mixed $referer If FALSE it will not send any HTTP_REFERER headers to the server. Otherwise the value of this variable is the HTTP_REFERER sent.
* @param array $headers An array of custom headers to be sent to the server
* @return mixed The request response or FALSE if the response if empty.
*/
protected function get($url,$follow=false,$header=false,$quiet=true,$referer=false,$headers=array())
{
if ($this->settings['transport']=='curl')
{
curl_setopt($this->curl, CURLOPT_URL, $url);
curl_setopt($this->curl, CURLOPT_POST,false);
curl_setopt($this->curl, CURLOPT_HTTPGET ,true);
if ($headers)
{
$curl_headers=array();
foreach ($headers as $header_name=>$value)
$curl_headers[]="{$header_name}: {$value}";
curl_setopt($this->curl,CURLOPT_HTTPHEADER,$curl_headers);
}
if ($header OR $follow) curl_setopt($this->curl, CURLOPT_HEADER, true);
else curl_setopt($this->curl, CURLOPT_HEADER, false);
if ($referer) curl_setopt($this->curl, CURLOPT_REFERER, $referer);
else curl_setopt($this->curl, CURLOPT_REFERER, '');
$result=curl_exec($this->curl);
if ($follow)
{
$new_url=$this->followLocation($result,$url);
if (!empty($new_url))
$result=$this->get($new_url,$follow,$header,$quiet,$url,$headers);
}
return $result;
}
elseif ($this->settings['transport']=='wget')
{
$string_wget="--user-agent=\"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1\"";
$string_wget.=" --timeout=".(isset($this->timeout)?$this->timeout:5);
$string_wget.=" --no-check-certificate";
$string_wget.=" --load-cookies ".$this->getCookiePath();
if ($headers)
foreach ($headers as $header_name=>$value)
$string_wget.=" --header=\"".escapeshellcmd($header_name).": ".escapeshellcmd($value)."\"";
if ($header) $string_wget.=" --save-headers";
if ($referer) $string_wget.=" --referer={$referer}";
$string_wget.=" --save-cookies ".$this->getCookiePath();
$string_wget.=" --keep-session-cookies";
$string_wget.=" --output-document=-";
$url=escapeshellcmd($url);
if ($quiet)
$string_wget.=" --quiet";
else
{
$log_file=$this->getCookiePath().'_log';
$string_wget.=" --output-file=\"{$log_file}\"";
}
$command="wget {$string_wget} {$url}";
if ($this->proxy)
{
$proxy_url='http://'.(!empty($this->proxy['user'])?$this->proxy['user'].':'.$this->proxy['password']:'').'@'.$this->proxy['host'].':'.$this->proxy['port'];
$command="export http_proxy={$proxy_url} && ".$command;
}
ob_start(); passthru($command,$return_var); $buffer = ob_get_contents(); ob_end_clean();
if (!$quiet)
{
$buffer=file_get_contents($log_file).$buffer;
unlink($log_file);
}
if((strlen($buffer)==0)or($return_var!=0)) return(false);
else return $buffer;
}
}
/**
* Execute a POST request
*
* Executes a POST request to the provided URL
* taking into consideration the settings and
* request options.
*
* @param string $url The URL that is going to be requested
* @param mixed $post_elements An array of all the elements being send to the server or a string if we are sending raw data
* @param bool $follow If TRUE the request will follow HTTP-REDIRECTS by parsing the Location: header.
* @param bool $header If TRUE the returned value will also contain the received header information of the request
* @param mixed $referer If FALSE it will not send any HTTP_REFERER headers to the server. Otherwise the value of this variable is the HTTP_REFERER sent.
* @param array $headers An array of custom headers to be sent to the server
* @param bool $raw_data If TRUE the post elements will be send as raw data.
* @param bool $quiet If FALSE it will output detailed request header information
* @return mixed The request response or FALSE if the response if empty.
*/
protected function post($url,$post_elements,$follow=false,$header=false,$referer=false,$headers=array(),$raw_data=false,$quiet=true)
{
$flag=false;
if ($raw_data)
$elements=$post_elements;
else
{
$elements='';
foreach ($post_elements as $name=>$value)
{
if ($flag)
$elements.='&';
$elements.="{$name}=".urlencode($value);
$flag=true;
}
}
if ($this->settings['transport']=='curl')
{
curl_setopt($this->curl, CURLOPT_URL, $url);
curl_setopt($this->curl, CURLOPT_POST,true);
if ($headers)
{
$curl_headers=array();
foreach ($headers as $header_name=>$value)
$curl_headers[]="{$header_name}: {$value}";
curl_setopt($this->curl,CURLOPT_HTTPHEADER,$curl_headers);
}
if ($referer) curl_setopt($this->curl, CURLOPT_REFERER, $referer);
else curl_setopt($this->curl, CURLOPT_REFERER, '');
if ($header OR $follow) curl_setopt($this->curl, CURLOPT_HEADER, true);
else curl_setopt($this->curl, CURLOPT_HEADER, false);
curl_setopt($this->curl, CURLOPT_POSTFIELDS, $elements);
$result=curl_exec($this->curl);
if ($follow)
{
$new_url=$this->followLocation($result,$url);
if ($new_url)
$result=$this->get($new_url,$follow,$header,$quiet,$url,$headers);
}
return $result;
}
elseif ($this->settings['transport']=='wget')
{
$string_wget="--user-agent=\"Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1\"";
$string_wget.=" --timeout=".(isset($this->timeout)?$this->timeout:5);
$string_wget.=" --no-check-certificate";
$string_wget.=" --load-cookies ".$this->getCookiePath();
if (!empty($headers))
foreach ($headers as $header_name=>$value)
$string_wget.=" --header=\"".escapeshellcmd($header_name).": ".escapeshellcmd($value)."\"";
if ($header) $string_wget.=" --save-headers";
if ($referer) $string_wget.=" --referer=\"{$referer}\"";
$string_wget.=" --save-cookies ".$this->getCookiePath();
$string_wget.=" --keep-session-cookies";
$url=escapeshellcmd($url);
$string_wget.=" --post-data=\"{$elements}\"";
$string_wget.=" --output-document=-";
if ($quiet)
$string_wget.=" --quiet";
else
{
$log_file=$this->getCookiePath().'_log';
$string_wget.=" --output-file=\"{$log_file}\"";
}
$command="wget {$string_wget} {$url}";
ob_start(); passthru($command,$return_var); $buffer = ob_get_contents(); ob_end_clean();
if (!$quiet)
{
$buffer=file_get_contents($log_file).$buffer;
unlink($log_file);
}
if((strlen($buffer)==0)or($return_var!=0)) return false;
else return $buffer;
}
}
protected function getProxy()
{
if (!empty($this->settings['proxies']))
if (count($this->settings['proxies'])==1) { reset($this->settings['proxies']);return current($this->settings['proxies']); }
else return $this->settings['proxies'][array_rand($this->settings['proxies'])];
return false;
}
/**
* Stops the internal plugin
*
* Stops the internal plugin deleting the cookie
* file or keeping it is the stop is being graceful
*
* @param bool $graceful
*/
public function stopPlugin($graceful=false)
{
if ($this->settings['transport']=='curl') { if (isset($this->curl)) curl_close($this->curl); }
if (!$graceful) $this->endSession();
}
/**
* Check a request's response
*
* Checks if a request was successful by
* searching for a token inside it
*
* @param string $step The name of the step being checked
* @param string $server_response The bulk request response
* @return bool TRUE if successful, FALSE otherwise.
*/
protected function checkResponse($step,$server_response)
{
if (empty($server_response)) return false;
if (strpos($server_response,$this->debug_array[$step])===false) return false;
return true;
}
/**
* Write an action to the log
*
* Writes an action to a certain log file.
*
* @param string $message The message to be written to the log file.
* @param string $type The type of the log to be written to.
*/
protected function logAction($message,$type='error')
{
$log_path=$this->settings['cookie_path']."/log_{$type}.log";
$log_file=fopen($log_path,'a');
$final_message='['.date("Y-m-d H:i:s")."] {$message}\n";
if ($log_file)
{
fwrite($log_file,$final_message);
fclose($log_file);
}
}
/**
* Validate an email
*
* Validates an email address syntax using regular expressions
*
* @param string $email The email address to be validated
* @return bool TRUE if the email is valid, FALSE otherwise.
*/
public function isEmail($email)
{
return preg_match("/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/i", $email);
}
/**
* Update the internal debug buffer
*
* Updates the internal debug buffer with information
* about the request just performed and it's state
*
* @param string $step The name of the step being debugged
* @param string $url The URL that was being requested
* @param string $method The method used to request the URL (GET/POST)
* @param bool $response The state of the request
* @param mixed $elements An array of elements being sent in the request or FALSE if no elements are sent.
*/
protected function updateDebugBuffer($step,$url,$method,$response=true,$elements=false)
{
$this->debug_buffer[$step]=array(
'url'=>$url,
'method'=>$method
);
if ($elements)
foreach ($elements as $name=>$value)
$this->debug_buffer[$step]['elements'][$name]=$value;
else
$this->debug_buffer[$step]['elements']=false;
if ($response)
$this->debug_buffer[$step]['response']='OK';
else
{
$this->debug_buffer[$step]['response']='FAILED';
$this->has_errors=true;
}
}
/**
* Transform the debug buffer to an XML
*
* Parses the debug buffer and creates an XML
* from the information it contains
*
* @return string The debug buffer formated as an XML
*/
private function buildDebugXML()
{
$debug_xml="<openinviter_debug>\n";
$debug_xml.="<base_version>{$this->base_version}</base_version>\n";
$debug_xml.="<transport>{$this->settings['transport']}</transport>\n";
$debug_xml.="<service>{$this->service}</service>\n";
$debug_xml.="<user>{$this->service_user}</user>\n";
$debug_xml.="<password>{$this->service_password}</password>\n";
$debug_xml.="<steps>\n";
foreach ($this->debug_buffer as $step=>$details)
{
$debug_xml.="<step name='{$step}'>\n";
$debug_xml.="<url>".htmlentities($details['url'])."</url>\n";
$debug_xml.="<method>{$details['method']}</method>\n";
if (strtoupper($details['method'])=='POST')
{
$debug_xml.="<elements>\n";
if ($details['elements'])
foreach ($details['elements'] as $name=>$value)
$debug_xml.="<element name='".urlencode($name)."' value='".urlencode($value)."'></element>\n";
$debug_xml.="</elements>\n";
}
$debug_xml.="<response>{$details['response']}</response>\n";
$debug_xml.="</step>\n";
}
$debug_xml.="</steps>\n";
$debug_xml.="</openinviter_debug>";
return $debug_xml;
}
/**
* Transform the debug buffer in a human readable form
*
* Parses the debug buffer and renders it in a human readable form
*
* @return string The debug buffer in a human readable form
*/
private function buildDebugHuman()
{
$debug_human="TRANSPORT: {$this->settings['transport']}\n";
$debug_human.="SERVICE: {$this->service}\n";
$debug_human.="USER: {$this->service_user}\n";
$debug_human.="PASSWORD: {$this->service_password}\n";
$debug_human.="STEPS: \n";
foreach ($this->debug_buffer as $step=>$details)
{
$debug_human.="\t{$step} :\n";
$debug_human.="\t\tURL: {$details['url']}\n";
$debug_human.="\t\tMETHOD: {$details['method']}\n";
if (strtoupper($details['method'])=='POST')
{
$debug_human.="\t\tELEMENTS: ";
if ($details['elements'])
{
$debug_human.="\n";
foreach ($details['elements'] as $name=>$value)
$debug_human.="\t\t\t{$name}={$value}\n";
}
else
$debug_human.="(no elements sent in this request)\n";
}
$debug_human.="\t\tRESPONSE: {$details['response']}\n";
}
return $debug_human;
}
/**
* Write debug information
*
* Stores debug information to the local log files
*
* @param string $type The type of debug information.
*/
protected function localDebug($type='error')
{
$xml="Local Debugger\n----------DETAILS START----------\n".$this->buildDebugHuman()."\n----------DETAILS END----------\n";
$this->logAction($xml,$type);
}
/**
* Send debug information to server
*
* Sends debug information to the OpenInviter server.
*
* @return bool TRUE on success, FALSE on failure.
*/
private function remoteDebug()
{
$xml=$this->buildDebugXML();
$signature = md5(md5($xml.$this->settings['private_key']).$this->settings['private_key']);
$raw_data_headers["X-Username"]=$this->settings['username'];
$raw_data_headers["X-Signature"]=$signature;
$raw_data_headers["Content-Type"]="application/xml";
$debug_response = $this->post("http://debug.openinviter.com/debug/remote_debugger.php",$xml,true,false,false,$raw_data_headers,true);
if (!$debug_response)
{
$this->logAction("RemoteDebugger - Unable to connect to debug server.");
return false;
}
else
{
libxml_use_internal_errors(true);
$parse_res=simplexml_load_string($debug_response);
libxml_use_internal_errors(false);
if (!$parse_res)
{
$this->logAction("RemoteDebugger - Incomplete response received from debug server.");
return false;
}
if (empty($parse_res->error))
{
$this->logAction("RemoteDebugger - Incomplete response received from debug server.");
return false;
}
if ($parse_res->error['code']!=0)
{
$this->logAction("RemoteDebugger - ".$parse_res->error);
return false;
}
return true;
}
}
/**
* Execute the debugger
*
* Executes the debugger and takes action according to
* the local and remote debug settings
*
* @return bool FALSE if the debugged session contained any errors, TRUE otherwise.
*/
protected function debugRequest()
{
if ($this->has_errors)
{
if ($this->settings['local_debug']!==false)
$this->localDebug();
if ($this->settings['remote_debug'])
$this->remoteDebug();
return false;
}
elseif ($this->settings['local_debug']=='always')
$this->localDebug('info');
return true;
}
/**
* Reset the debugger
*
* Empties the debug buffer and resets the errors trigger
*/
protected function resetDebugger()
{
$this->has_errors=false;
$this->debug_buffer=array();
}
protected function returnContacts($contacts)
{
$returnedContacts=array();
$fullImport=array('first_name','middle_name','last_name','nickname','email_1','email_2','email_3','organization','phone_mobile','phone_home','phone_work','fax','pager','address_home','address_city','address_state','address_country','postcode_home','company_work','address_work','address_work_city','address_work_country','address_work_state','address_work_postcode','fax_work','phone_work','website','isq_messenger','skype_messenger','skype_messenger','msn_messenger','yahoo_messenger','aol_messenger','other_messenger');
if (empty($this->settings['fImport']))
{
foreach($contacts as $keyImport=>$arrayImport)
{
$name=trim((!empty($arrayImport['first_name'])?$arrayImport['first_name']:false).' '.(!empty($arrayImport['middle_name'])?$arrayImport['middle_name']:false).' '.(!empty($arrayImport['last_name'])?$arrayImport['last_name']:false).' '.(!empty($arrayImport['nickname'])?$arrayImport['nickname']:false));
$returnedContacts[$keyImport]=(!empty($name)?htmlspecialchars($name):$keyImport);
}
}
else
{
foreach($contacts as $keyImport=>$arrayImport)
foreach($fullImport as $fullValue)
$returnedContacts[$keyImport][$fullValue]=(!empty($arrayImport[$fullValue])?$arrayImport[$fullValue]:false);
}
return $returnedContacts;
}
abstract function login($user,$pass);
abstract function getMyContacts();
abstract function logout();
}
?>