diff --git a/README b/README index 00d2ff5..0c2f53d 100644 --- a/README +++ b/README @@ -31,12 +31,8 @@ documentation on the website. TODO ================================================================================ -* Rosters (I know, a big one) * Documentation -* TLS Cert Inspection (Even possible in PHP?) * MUC Support -* Plugins -* XML Masking Handlers License Exception =============================================================================== diff --git a/XMPPHP/XMPP.php b/XMPPHP/XMPP.php index e88441f..ed7f55b 100644 --- a/XMPPHP/XMPP.php +++ b/XMPPHP/XMPP.php @@ -45,12 +45,12 @@ class XMPPHP_XMPP extends XMPPHP_XMLStream { /** * @var string */ - protected $server; + public $server; /** * @var string */ - protected $user; + public $user; /** * @var string @@ -380,4 +380,41 @@ class XMPPHP_XMPP extends XMPPHP_XMLStream { stream_socket_enable_crypto($this->socket, true, STREAM_CRYPTO_METHOD_SSLv23_CLIENT); $this->reset(); } + + /** + * Retrieves the vcard + * + */ + public function getVCard($jid = Null) { + $id = $this->getID(); + $this->addIdHandler($id, 'vcard_get_handler'); + if($jid) { + $this->send(""); + } else { + $this->send(""); + } + } + + /** + * VCard retrieval handler + * + * @param XML Object $xml + */ + protected function vcard_get_handler($xml) { + $vcard_array = array(); + $vcard = $xml->sub('vcard'); + // go through all of the sub elements and add them to the vcard array + foreach ($vcard->subs as $sub) { + if ($sub->subs) { + $vcard_array[$sub->name] = array(); + foreach ($sub->subs as $sub_child) { + $vcard_array[$sub->name][$sub_child->name] = $sub_child->data; + } + } else { + $vcard_array[$sub->name] = $sub->data; + } + } + $vcard_array['from'] = $xml->attrs['from']; + $this->event('vcard', $vcard_array); + } } diff --git a/cli_longrun_example.php b/cli_longrun_example.php index 6c40319..ce7218b 100644 --- a/cli_longrun_example.php +++ b/cli_longrun_example.php @@ -10,6 +10,8 @@ include 'XMPPHP/XMPP.php'; $conn = new XMPPHP_XMPP('talk.google.com', 5222, 'username', 'password', 'xmpphp', 'gmail.com', $printlog=true, $loglevel=XMPPHP_Log::LEVEL_INFO); $conn->autoSubscribe(); +$vcard_request = array(); + try { $conn->connect(); while(!$conn->isDisconnected()) { @@ -24,8 +26,15 @@ try { print $pl['body'] . "\n"; print "---------------------------------------------------------------------------------\n"; $conn->message($pl['from'], $body="Thanks for sending me \"{$pl['body']}\".", $type=$pl['type']); - if($pl['body'] == 'quit') $conn->disconnect(); - if($pl['body'] == 'break') $conn->send(""); + if($cmd[0] == 'quit') $conn->disconnect(); + if($cmd[0] == 'break') $conn->send(""); + if($cmd[0] == 'vcard') { + if(!($cmd[1])) $cmd[1] = $conn->user . '@' . $conn->server; + // take a note which user requested which vcard + $vcard_request[$pl['from']] = $cmd[1]; + // request the vcard + $conn->getVCard($cmd[1]); + } break; case 'presence': print "Presence: {$pl['from']} [{$pl['show']}] {$pl['status']}\n"; @@ -35,6 +44,30 @@ try { $conn->getRoster(); $conn->presence($status="Cheese!"); break; + case 'vcard': + // check to see who requested this vcard + $deliver = array_keys($vcard_request, $pl['from']); + // work through the array to generate a message + print_r($pl); + $msg = ''; + foreach($pl as $key => $item) { + $msg .= "$key: "; + if(is_array($item)) { + $msg .= "\n"; + foreach($item as $subkey => $subitem) { + $msg .= " $subkey: $subitem\n"; + } + } else { + $msg .= "$item\n"; + } + } + // deliver the vcard msg to everyone that requested that vcard + foreach($deliver as $sendjid) { + // remove the note on requests as we send out the message + unset($vcard_request[$sendjid]); + $conn->message($sendjid, $msg, 'chat'); + } + break; } } }