X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FMsn%2Fextlib%2Fphpmsnclass%2Fmsn.class.php;h=996c5571c20bd2c0a29458b7b1a00ef654f2e97b;hb=5bf0c9f610d2fe7852ffafbcd51436c9e057b0a7;hp=3362c2f434b44c72c28c8dc64f2eda3ca64394d4;hpb=c4458bc40ae4269baf6627191f44d8fe4eb60075;p=quix0rs-gnu-social.git diff --git a/plugins/Msn/extlib/phpmsnclass/msn.class.php b/plugins/Msn/extlib/phpmsnclass/msn.class.php index 3362c2f434..996c5571c2 100644 --- a/plugins/Msn/extlib/phpmsnclass/msn.class.php +++ b/plugins/Msn/extlib/phpmsnclass/msn.class.php @@ -12,7 +12,7 @@ Documentation on the MSN protocol can be found at: http://msnpiki.msnfanatic.com This class uses MSNP15. In addition to PHP5, the additional php modules required are: -curl pcre mhash mcrypt bcmath +curl pcre mcrypt bcmath */ @@ -156,7 +156,6 @@ class MSN { // Check support if (!function_exists('curl_init')) throw new Exception("curl module not found!\n"); if (!function_exists('preg_match')) throw new Exception("pcre module not found!\n"); - if (!function_exists('mhash')) throw new Exception("mhash module not found!\n"); if (!function_exists('mcrypt_cbc')) throw new Exception("mcrypt module not found!\n"); if (!function_exists('bcmod')) throw new Exception("bcmath module not found!\n"); @@ -486,7 +485,7 @@ class MSN { if(!empty($message)) { $this->debug_message($message); } - $this->callHandler('ConnectFailed'); + $this->callHandler('ConnectFailed', $message); $this->NSRetryWait($this->retry_wait); } @@ -901,7 +900,6 @@ class MSN { case 'NLN': // NS: <<< NLN {status} {email} {networkid} {nickname} {clientid} {dpobj} - // NS: <<< NLN NLN darkip@inflatablegoldfish.com 1 Luke 2685403136 0 @list(/* NLN */, $status, $email, $network, $nickname) = @explode(' ', $data); $this->callHandler('StatusChange', array('screenname' => $email, 'status' => $status, 'network' => $network, 'nickname' => $nickname)); break; @@ -950,7 +948,10 @@ class MSN { // SB: <<< IRO {id} {rooster} {roostercount} {email} {alias} {clientid} @list(/* IRO */, /* id */, $cur_num, $total, $email, $alias, $clientid) = @explode(' ', $data); $this->debug_message("*** $email joined session"); - $session['joined'] = true; + if ($email == $session['to']) { + $session['joined'] = true; + $this->callHandler('SessionReady', array('to' => $email)); + } break; case 'BYE': $this->debug_message("*** Quit for BYE"); @@ -971,9 +972,11 @@ class MSN { case 'JOI': // SB: <<< JOI {user} {alias} {clientid?} // someone join us - // we don't need the data, just ignore it - // no more user here - $session['joined'] = true; + @list(/* JOI */, $email) = @explode(' ', $data); + if ($email == $session['to']) { + $session['joined'] = true; + $this->callHandler('SessionReady', array('to' => $email)); + } break; case 'MSG': // SB: <<< MSG {email} {alias} {len} @@ -1479,6 +1482,7 @@ class MSN { if ($this->sb_writeln($socket, $id, "MSG $id N $len") === false || $this->sb_writedata($socket, $SendString) === false) { + $this->endSBSession($socket); return false; } } @@ -1486,6 +1490,7 @@ class MSN { if ($this->sb_writeln($socket, $id, "MSG $id N $len") === false || $this->sb_writedata($socket, $aMessage) === false) { + $this->endSBSession($socket); return false; } @@ -1519,8 +1524,14 @@ class MSN { * where network is 1 for MSN, 32 for Yahoo * and 'Offline' for offline messages * @param string $message Message + * @param boolean &$waitForSession Boolean passed by reference, + * if set to true on return, message + * did not fail to send but is + * waiting for a valid session + * + * @return boolean true on success */ - public function sendMessage($to, $message) { + public function sendMessage($to, $message, &$waitForSession) { if ($message != '') { $toParts = explode('@', $to); if(count($toParts) < 3) { @@ -1538,6 +1549,8 @@ class MSN { $this->debug_message("*** No existing SB session or request has timed out"); $this->reqSBSession($recipient); } + + $waitForSession = true; return false; } else { $socket = $this->switchBoardSessionLookup[$recipient]; @@ -1545,10 +1558,12 @@ class MSN { if ($this->switchBoardSessions[$intsocket]['offline']) { $this->debug_message("*** Contact ($recipient) offline, sending OIM"); $this->endSBSession($socket); + $waitForSession = false; return $this->sendMessage($recipient.'@Offline', $message); } else { if ($this->switchBoardSessions[$intsocket]['joined'] !== true) { $this->debug_message("*** Recipient has not joined session, returning false"); + $waitForSession = true; return false; } @@ -1559,6 +1574,7 @@ class MSN { return true; } + $waitForSession = false; return false; } } @@ -2634,10 +2650,10 @@ X-OIM-Sequence-Num: 1 */ private function derive_key($key, $magic) { - $hash1 = mhash(MHASH_SHA1, $magic, $key); - $hash2 = mhash(MHASH_SHA1, $hash1.$magic, $key); - $hash3 = mhash(MHASH_SHA1, $hash1, $key); - $hash4 = mhash(MHASH_SHA1, $hash3.$magic, $key); + $hash1 = $this->mhash_sha1($magic, $key); + $hash2 = $this->mhash_sha1($hash1.$magic, $key); + $hash3 = $this->mhash_sha1($hash1, $key); + $hash4 = $this->mhash_sha1($hash3.$magic, $key); return $hash2.substr($hash4, 0, 4); } @@ -2647,7 +2663,7 @@ X-OIM-Sequence-Num: 1 $key3 = $this->derive_key($key1, 'WS-SecureConversationSESSION KEY ENCRYPTION'); // get hash of challenge using key2 - $hash = mhash(MHASH_SHA1, $challenge, $key2); + $hash = $this->mhash_sha1($challenge, $key2); // get 8 bytes random data $iv = substr(base64_encode(rand(1000,9999).rand(1000,9999)), 2, 8); @@ -3101,7 +3117,7 @@ X-OIM-Sequence-Num: 1 * Registers a user handler * * Handler List - * IMIn, Pong, ConnectFailed, Reconnect, + * IMIn, SessionReady, Pong, ConnectFailed, Reconnect, * AddedToList, RemovedFromList, StatusChange * * @param string $event Event name @@ -3163,4 +3179,32 @@ X-OIM-Sequence-Num: 1 $buf .= "$h_str $a_str\n"; return $buf; } + + function mhash_sha1($data, $key) + { + if (extension_loaded("mhash")) + return mhash(MHASH_SHA1, $data, $key); + + if (function_exists("hash_hmac")) + return hash_hmac('sha1', $data, $key, true); + + // RFC 2104 HMAC implementation for php. Hacked by Lance Rushing + $b = 64; + if (strlen($key) > $b) + $key = pack("H*", sha1($key)); + $key = str_pad($key, $b, chr(0x00)); + $ipad = str_pad("", $b, chr(0x36)); + $opad = str_pad("", $b, chr(0x5c)); + $k_ipad = $key ^ $ipad ; + $k_opad = $key ^ $opad; + + $sha1_value = sha1($k_opad . pack("H*", sha1($k_ipad . $data))); + + $hash_data = ''; + $str = join('',explode('\x', $sha1_value)); + $len = strlen($str); + for ($i = 0; $i < $len; $i += 2) + $hash_data .= chr(hexdec(substr($str, $i, 2))); + return $hash_data; + } }