konvos intergration

This commit is contained in:
Karl Hudgell 2015-11-25 21:35:06 +00:00
parent 9c95258471
commit e0085d4424
21 changed files with 3915 additions and 9 deletions

View File

@ -2,7 +2,21 @@
CACLS *.* /e /p everyone:f
echo ^<?php >>config.php
echo $knews = "http://knews.cf"; >> config.php
echo $kloud = "https://k-loud.cf"; >> config.php
echo $konvos = "http://konvos.cf"; >> config.php
findstr "http://knews.cf" config.php >nul 2>&1
if errorlevel 1 echo Already Updated
if errorlevel 0 echo $knews = "http://knews.cf"; >> config.php
findstr "http://k-loud.cf" config.php >nul 2>&1
if errorlevel 1 echo Already Updated
if errorlevel 0 echo $kloud = "https://k-loud.cf"; >> config.php
findstr "http://konvos.cf" config.php >nul 2>&1
if errorlevel 1 echo Already Updated
if errorlevel 0 echo $konvos = "http://konvos.cf"; >> config.php
findstr "konvosvisible" config.php >nul 2>&1
if errorlevel 1 echo Already Updated
if errorlevel 0 echo $konvosvisible = "1"; >> config.php
echo ^?^> >> config.php

View File

@ -4,8 +4,4 @@ findstr "http://webclip.ml" config.php >nul 2>&1
if errorlevel 1 echo Already Updated
if errorlevel 0 cscript replace.vbs "config.php" "http://webclip.ml" "http://klips.cf"
findstr "knews.cf" config.php >nul 2>&1
if errorlevel 1 findstr "k-loud.cf" config.php >nul 2>&1
if errorlevel 1 findstr "konvos.cf" config.php >nul 2>&1
if errorlevel 1 ImportLines.bat
if errorlevel 0 echo Already Updated
ImportLines.bat

237
builds/converse.min.js vendored Normal file

File diff suppressed because one or more lines are too long

29
composer.json Normal file
View File

@ -0,0 +1,29 @@
{
"name": "piotr-cz/xmpp-prebind-php",
"description": "This class is for prebinding a XMPP Session with PHP.",
"version": "0.1.0",
"type": "library",
"keywords": ["xmpp", "php", "prebind"],
"homepage": "http://jolicode.com",
"license": "MIT",
"authors": [
{
"name": "Michael Weibel"
},
{
"name": "piotr",
"email": "hello@piotr.cz"
},
{
"name": "Alex Knol",
"email": "alex@cobrowser.net"
}
],
"autoload": {
"classmap": ["lib/"]
},
"require": {
"php": ">=5.3",
"lib-libxml": "*"
}
}

30
css/converse.min.css vendored Normal file

File diff suppressed because one or more lines are too long

33
konvos.php Normal file
View File

@ -0,0 +1,33 @@
<html>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.js" type="text/javascript"></script>
<style>
.hiddenRow { display: none; }
</style>
<script>
function toggleNextRow(row) {
var nextRow = $(row).next();
nextRow.toggle();
}
</script>
</head>
<table width='275' cellspacing='0' cellpadding='1'>
<tr onclick="toggleNextRow(this)" BGCOLOR='#0066FF'>
<th style='text-align: left;'><font color='white'>Konvos Status</font></th>
</tr>
<tr>
<td BGCOLOR='#FFFFFF'>
<table id='konvostable' width='275' border='0' cellspacing='0' cellpadding='1'><thead><tr onclick='togglebodyServers()' BGCOLOR='#0066FF'><th style='text-align: left;'><font color='white'>User</font></th><th style='text-align: left;'><font color='white'>Status</font></th></tr></thead>
<tbody><td BGCOLOR='#FFFFFF'>Karl</td><td BGCOLOR='#FFFFFF'><?php require "http://konvos.cf:5280/status/karl/html"; ?></td></tr>
<tbody><td BGCOLOR='#FFFFFF'>Duly</td><td BGCOLOR='#FFFFFF'><?php require "http://konvos.cf:5280/status/duly/html"; ?></td></tr>
<tbody><td BGCOLOR='#FFFFFF'>Darren</td><td BGCOLOR='#FFFFFF'><?php require "http://konvos.cf:5280/status/darren/html"; ?></td></tr>
<tbody><td BGCOLOR='#FFFFFF'>Kris</td><td BGCOLOR='#FFFFFF'><?php require "http://konvos.cf:5280/status/kris/html"; ?></td></tr>
</table>
<div id="clockbox" style="font:12pt Arial; color:#0066FF;"></div>
</select>
</form>
</td>
</table>

103
lib/Auth/SASL.php Normal file
View File

@ -0,0 +1,103 @@
<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2002-2003 Richard Heyes |
// | All rights reserved. |
// | |
// | Redistribution and use in source and binary forms, with or without |
// | modification, are permitted provided that the following conditions |
// | are met: |
// | |
// | o Redistributions of source code must retain the above copyright |
// | notice, this list of conditions and the following disclaimer. |
// | o Redistributions in binary form must reproduce the above copyright |
// | notice, this list of conditions and the following disclaimer in the |
// | documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote |
// | products derived from this software without specific prior written |
// | permission. |
// | |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
// | |
// +-----------------------------------------------------------------------+
// | Author: Richard Heyes <richard@php.net> |
// +-----------------------------------------------------------------------+
//
/**
* Client implementation of various SASL mechanisms
*
* @author Richard Heyes <richard@php.net>
* @author Michael Weibel <michael.weibel@amiadogroup.com> (made it work for PHP5)
* @access public
* @version 1.0.1
* @package Auth_SASL
*/
require_once(dirname(__FILE__) . '/SASL/Exception.php');
class Auth_SASL
{
/**
* Factory class. Returns an object of the request
* type.
*
* @param string $type One of: Anonymous
* Plain
* CramMD5
* DigestMD5
* Types are not case sensitive
*/
public static function factory($type)
{
switch (strtolower($type)) {
case 'anonymous':
$filename = 'SASL/Anonymous.php';
$classname = 'Auth_SASL_Anonymous';
break;
case 'login':
$filename = 'SASL/Login.php';
$classname = 'Auth_SASL_Login';
break;
case 'plain':
$filename = 'SASL/Plain.php';
$classname = 'Auth_SASL_Plain';
break;
case 'external':
$filename = 'SASL/External.php';
$classname = 'Auth_SASL_External';
break;
case 'cram-md5':
$filename = 'SASL/CramMD5.php';
$classname = 'Auth_SASL_CramMD5';
break;
case 'digest-md5':
$filename = 'SASL/DigestMD5.php';
$classname = 'Auth_SASL_DigestMD5';
break;
default:
throw new Auth_SASL_Exception('Invalid SASL mechanism type ("' . $type .'")');
break;
}
require_once(dirname(__FILE__) . '/' . $filename);
$obj = new $classname();
return $obj;
}
}
?>

View File

@ -0,0 +1,71 @@
<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2002-2003 Richard Heyes |
// | All rights reserved. |
// | |
// | Redistribution and use in source and binary forms, with or without |
// | modification, are permitted provided that the following conditions |
// | are met: |
// | |
// | o Redistributions of source code must retain the above copyright |
// | notice, this list of conditions and the following disclaimer. |
// | o Redistributions in binary form must reproduce the above copyright |
// | notice, this list of conditions and the following disclaimer in the |
// | documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote |
// | products derived from this software without specific prior written |
// | permission. |
// | |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
// | |
// +-----------------------------------------------------------------------+
// | Author: Richard Heyes <richard@php.net> |
// +-----------------------------------------------------------------------+
//
/**
* Implmentation of ANONYMOUS SASL mechanism
*
* @author Richard Heyes <richard@php.net>
* @author Michael Weibel <michael.weibel@amiadogroup.com> (made it work for PHP5)
* @access public
* @version 1.0.1
* @package Auth_SASL
*/
require_once(dirname(__FILE__) . '/Common.php');
class Auth_SASL_Anonymous extends Auth_SASL_Common
{
/**
* Not much to do here except return the token supplied.
* No encoding, hashing or encryption takes place for this
* mechanism, simply one of:
* o An email address
* o An opaque string not containing "@" that can be interpreted
* by the sysadmin
* o Nothing
*
* We could have some logic here for the second option, but this
* would by no means create something interpretable.
*
* @param string $token Optional email address or string to provide
* as trace information.
* @return string The unaltered input token
*/
public function getResponse($token = '')
{
return $token;
}
}
?>

76
lib/Auth/SASL/Common.php Normal file
View File

@ -0,0 +1,76 @@
<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2002-2003 Richard Heyes |
// | All rights reserved. |
// | |
// | Redistribution and use in source and binary forms, with or without |
// | modification, are permitted provided that the following conditions |
// | are met: |
// | |
// | o Redistributions of source code must retain the above copyright |
// | notice, this list of conditions and the following disclaimer. |
// | o Redistributions in binary form must reproduce the above copyright |
// | notice, this list of conditions and the following disclaimer in the |
// | documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote |
// | products derived from this software without specific prior written |
// | permission. |
// | |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
// | |
// +-----------------------------------------------------------------------+
// | Author: Richard Heyes <richard@php.net> |
// +-----------------------------------------------------------------------+
//
/**
* Common functionality to SASL mechanisms
*
* @author Richard Heyes <richard@php.net>
* @author Michael Weibel <michael.weibel@amiadogroup.com> (made it work for PHP5)
* @access public
* @version 1.0.1
* @package Auth_SASL
*/
require_once(dirname(__FILE__) . '/Exception.php');
class Auth_SASL_Common
{
/**
* Function which implements HMAC MD5 digest
*
* @param string $key The secret key
* @param string $data The data to protect
* @return string The HMAC MD5 digest
*/
protected function HMAC_MD5($key, $data)
{
if (strlen($key) > 64) {
$key = pack('H32', md5($key));
}
if (strlen($key) < 64) {
$key = str_pad($key, 64, chr(0));
}
$k_ipad = substr($key, 0, 64) ^ str_repeat(chr(0x36), 64);
$k_opad = substr($key, 0, 64) ^ str_repeat(chr(0x5C), 64);
$inner = pack('H32', md5($k_ipad . $data));
$digest = md5($k_opad . $inner);
return $digest;
}
}
?>

68
lib/Auth/SASL/CramMD5.php Normal file
View File

@ -0,0 +1,68 @@
<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2002-2003 Richard Heyes |
// | All rights reserved. |
// | |
// | Redistribution and use in source and binary forms, with or without |
// | modification, are permitted provided that the following conditions |
// | are met: |
// | |
// | o Redistributions of source code must retain the above copyright |
// | notice, this list of conditions and the following disclaimer. |
// | o Redistributions in binary form must reproduce the above copyright |
// | notice, this list of conditions and the following disclaimer in the |
// | documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote |
// | products derived from this software without specific prior written |
// | permission. |
// | |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
// | |
// +-----------------------------------------------------------------------+
// | Author: Richard Heyes <richard@php.net> |
// +-----------------------------------------------------------------------+
//
/**
* Implmentation of CRAM-MD5 SASL mechanism
*
* @author Richard Heyes <richard@php.net>
* @author Michael Weibel <michael.weibel@amiadogroup.com> (made it work for PHP5)
* @access public
* @version 1.0.1
* @package Auth_SASL
*/
require_once(dirname(__FILE__) . '/Common.php');
class Auth_SASL_CramMD5 extends Auth_SASL_Common
{
/**
* Implements the CRAM-MD5 SASL mechanism
* This DOES NOT base64 encode the return value,
* you will need to do that yourself.
*
* @param string $user Username
* @param string $pass Password
* @param string $challenge The challenge supplied by the server.
* this should be already base64_decoded.
*
* @return string The string to pass back to the server, of the form
* "<user> <digest>". This is NOT base64_encoded.
*/
public function getResponse($user, $pass, $challenge)
{
return $user . ' ' . $this->HMAC_MD5($pass, $challenge);
}
}
?>

197
lib/Auth/SASL/DigestMD5.php Normal file
View File

@ -0,0 +1,197 @@
<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2002-2003 Richard Heyes |
// | All rights reserved. |
// | |
// | Redistribution and use in source and binary forms, with or without |
// | modification, are permitted provided that the following conditions |
// | are met: |
// | |
// | o Redistributions of source code must retain the above copyright |
// | notice, this list of conditions and the following disclaimer. |
// | o Redistributions in binary form must reproduce the above copyright |
// | notice, this list of conditions and the following disclaimer in the |
// | documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote |
// | products derived from this software without specific prior written |
// | permission. |
// | |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
// | |
// +-----------------------------------------------------------------------+
// | Author: Richard Heyes <richard@php.net> |
// +-----------------------------------------------------------------------+
//
/**
* Implmentation of DIGEST-MD5 SASL mechanism
*
* @author Richard Heyes <richard@php.net>
* @author Michael Weibel <michael.weibel@amiadogroup.com> (made it work for PHP5)
* @access public
* @version 1.0.1
* @package Auth_SASL
*/
require_once(dirname(__FILE__) . '/Common.php');
class Auth_SASL_DigestMD5 extends Auth_SASL_Common
{
/**
* Provides the (main) client response for DIGEST-MD5
* requires a few extra parameters than the other
* mechanisms, which are unavoidable.
*
* @param string $authcid Authentication id (username)
* @param string $pass Password
* @param string $challenge The digest challenge sent by the server
* @param string $hostname The hostname of the machine you're connecting to
* @param string $service The servicename (eg. imap, pop, acap etc)
* @param string $authzid Authorization id (username to proxy as)
* @return string The digest response (NOT base64 encoded)
* @access public
*/
public function getResponse($authcid, $pass, $challenge, $hostname, $service, $authzid = '')
{
$challenge = $this->parseChallenge($challenge);
$authzid_string = '';
if ($authzid != '') {
$authzid_string = ',authzid="' . $authzid . '"';
}
if (!empty($challenge)) {
$cnonce = $this->getCnonce();
$digest_uri = sprintf('%s/%s', $service, $hostname);
$response_value = $this->getResponseValue($authcid, $pass, $challenge['realm'], $challenge['nonce'], $cnonce, $digest_uri, $authzid);
if ($challenge['realm']) {
return sprintf('username="%s",realm="%s"' . $authzid_string .
',nonce="%s",cnonce="%s",nc=00000001,qop=auth,digest-uri="%s",response=%s,maxbuf=%d', $authcid, $challenge['realm'], $challenge['nonce'], $cnonce, $digest_uri, $response_value, $challenge['maxbuf']);
} else {
return sprintf('username="%s"' . $authzid_string . ',nonce="%s",cnonce="%s",nc=00000001,qop=auth,digest-uri="%s",response=%s,maxbuf=%d', $authcid, $challenge['nonce'], $cnonce, $digest_uri, $response_value, $challenge['maxbuf']);
}
} else {
throw new Auth_SASL_Exception('Invalid digest challenge');
}
}
/**
* Parses and verifies the digest challenge*
*
* @param string $challenge The digest challenge
* @return array The parsed challenge as an assoc
* array in the form "directive => value".
* @access private
*/
private function parseChallenge($challenge)
{
$tokens = array();
while (preg_match('/^([a-z-]+)=("[^"]+(?<!\\\)"|[^,]+)/i', $challenge, $matches)) {
// Ignore these as per rfc2831
if ($matches[1] == 'opaque' OR $matches[1] == 'domain') {
$challenge = substr($challenge, strlen($matches[0]) + 1);
continue;
}
// Allowed multiple "realm" and "auth-param"
if (!empty($tokens[$matches[1]]) AND ($matches[1] == 'realm' OR $matches[1] == 'auth-param')) {
if (is_array($tokens[$matches[1]])) {
$tokens[$matches[1]][] = preg_replace('/^"(.*)"$/', '\\1', $matches[2]);
} else {
$tokens[$matches[1]] = array($tokens[$matches[1]], preg_replace('/^"(.*)"$/', '\\1', $matches[2]));
}
// Any other multiple instance = failure
} elseif (!empty($tokens[$matches[1]])) {
$tokens = array();
break;
} else {
$tokens[$matches[1]] = preg_replace('/^"(.*)"$/', '\\1', $matches[2]);
}
// Remove the just parsed directive from the challenge
$challenge = substr($challenge, strlen($matches[0]) + 1);
}
/**
* Defaults and required directives
*/
// Realm
if (empty($tokens['realm'])) {
$tokens['realm'] = "";
}
// Maxbuf
if (empty($tokens['maxbuf'])) {
$tokens['maxbuf'] = 65536;
}
// Required: nonce, algorithm
if (empty($tokens['nonce']) OR empty($tokens['algorithm'])) {
return array();
}
return $tokens;
}
/**
* Creates the response= part of the digest response
*
* @param string $authcid Authentication id (username)
* @param string $pass Password
* @param string $realm Realm as provided by the server
* @param string $nonce Nonce as provided by the server
* @param string $cnonce Client nonce
* @param string $digest_uri The digest-uri= value part of the response
* @param string $authzid Authorization id
* @return string The response= part of the digest response
* @access private
*/
private function getResponseValue($authcid, $pass, $realm, $nonce, $cnonce, $digest_uri, $authzid = '')
{
if ($authzid == '') {
$A1 = sprintf('%s:%s:%s', pack('H32', md5(sprintf('%s:%s:%s', $authcid, $realm, $pass))), $nonce, $cnonce);
} else {
$A1 = sprintf('%s:%s:%s:%s', pack('H32', md5(sprintf('%s:%s:%s', $authcid, $realm, $pass))), $nonce, $cnonce, $authzid);
}
$A2 = 'AUTHENTICATE:' . $digest_uri;
return md5(sprintf('%s:%s:00000001:%s:auth:%s', md5($A1), $nonce, $cnonce, md5($A2)));
}
/**
* Creates the client nonce for the response
*
* @return string The cnonce value
* @access private
*/
private function getCnonce()
{
if (file_exists('/dev/urandom') && $fd = fopen('/dev/urandom', 'r')) {
return base64_encode(fread($fd, 32));
} elseif (file_exists('/dev/random') && $fd = fopen('/dev/random', 'r')) {
return base64_encode(fread($fd, 32));
} else {
$str = '';
for ($i=0; $i<32; $i++) {
$str .= chr(mt_rand(0, 255));
}
return base64_encode($str);
}
}
}
?>

View File

@ -0,0 +1,37 @@
<?php
/**
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* o Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* o Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* o The names of the authors may not be used to endorse or promote
* products derived from this software without specific prior written
* permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* @author Michael Weibel <michael.weibel@amiadogroup.com>
*/
/**
* Auth SASL Exception
*
* @author Michael Weibel <michael.weibel@amiadogroup.com>
* @package Auth_SASL
*/
class Auth_SASL_Exception extends Exception {}

View File

@ -0,0 +1,63 @@
<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2008 Christoph Schulz |
// | All rights reserved. |
// | |
// | Redistribution and use in source and binary forms, with or without |
// | modification, are permitted provided that the following conditions |
// | are met: |
// | |
// | o Redistributions of source code must retain the above copyright |
// | notice, this list of conditions and the following disclaimer. |
// | o Redistributions in binary form must reproduce the above copyright |
// | notice, this list of conditions and the following disclaimer in the |
// | documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote |
// | products derived from this software without specific prior written |
// | permission. |
// | |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
// | |
// +-----------------------------------------------------------------------+
// | Author: Christoph Schulz <develop@kristov.de> |
// +-----------------------------------------------------------------------+
//
/**
* Implmentation of EXTERNAL SASL mechanism
*
* @author Christoph Schulz <develop@kristov.de>
* @author Michael Weibel <michael.weibel@amiadogroup.com> (made it work for PHP5)
* @access public
* @version 1.0.4
* @package Auth_SASL
*/
require_once(dirname(__FILE__) . '/Common.php');
class Auth_SASL_External extends Auth_SASL_Common
{
/**
* Returns EXTERNAL response
*
* @param string $authcid Authentication id (username)
* @param string $pass Password
* @param string $authzid Autorization id
* @return string EXTERNAL Response
*/
public function getResponse($authcid, $pass, $authzid = '')
{
return $authzid;
}
}
?>

65
lib/Auth/SASL/Login.php Normal file
View File

@ -0,0 +1,65 @@
<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2002-2003 Richard Heyes |
// | All rights reserved. |
// | |
// | Redistribution and use in source and binary forms, with or without |
// | modification, are permitted provided that the following conditions |
// | are met: |
// | |
// | o Redistributions of source code must retain the above copyright |
// | notice, this list of conditions and the following disclaimer. |
// | o Redistributions in binary form must reproduce the above copyright |
// | notice, this list of conditions and the following disclaimer in the |
// | documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote |
// | products derived from this software without specific prior written |
// | permission. |
// | |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
// | |
// +-----------------------------------------------------------------------+
// | Author: Richard Heyes <richard@php.net> |
// +-----------------------------------------------------------------------+
//
/**
* This is technically not a SASL mechanism, however
* it's used by Net_Sieve, Net_Cyrus and potentially
* other protocols , so here is a good place to abstract
* it.
*
* @author Richard Heyes <richard@php.net>
* @author Michael Weibel <michael.weibel@amiadogroup.com> (made it work for PHP5)
* @access public
* @version 1.0
* @package Auth_SASL
*/
require_once(dirname(__FILE__) . '/Common.php');
class Auth_SASL_Login extends Auth_SASL_Common
{
/**
* Pseudo SASL LOGIN mechanism
*
* @param string $user Username
* @param string $pass Password
* @return string LOGIN string
*/
public function getResponse($user, $pass)
{
return sprintf('LOGIN %s %s', $user, $pass);
}
}
?>

63
lib/Auth/SASL/Plain.php Normal file
View File

@ -0,0 +1,63 @@
<?php
// +-----------------------------------------------------------------------+
// | Copyright (c) 2002-2003 Richard Heyes |
// | All rights reserved. |
// | |
// | Redistribution and use in source and binary forms, with or without |
// | modification, are permitted provided that the following conditions |
// | are met: |
// | |
// | o Redistributions of source code must retain the above copyright |
// | notice, this list of conditions and the following disclaimer. |
// | o Redistributions in binary form must reproduce the above copyright |
// | notice, this list of conditions and the following disclaimer in the |
// | documentation and/or other materials provided with the distribution.|
// | o The names of the authors may not be used to endorse or promote |
// | products derived from this software without specific prior written |
// | permission. |
// | |
// | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
// | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
// | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
// | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
// | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
// | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
// | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
// | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
// | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
// | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
// | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
// | |
// +-----------------------------------------------------------------------+
// | Author: Richard Heyes <richard@php.net> |
// +-----------------------------------------------------------------------+
//
/**
* Implmentation of PLAIN SASL mechanism
*
* @author Richard Heyes <richard@php.net>
* @author Michael Weibel <michael.weibel@amiadogroup.com> (made it work for PHP5)
* @access public
* @version 1.0
* @package Auth_SASL
*/
require_once(dirname(__FILE__) . '/Common.php');
class Auth_SASL_Plain extends Auth_SASL_Common
{
/**
* Returns PLAIN response
*
* @param string $authcid Authentication id (username)
* @param string $pass Password
* @param string $authzid Autorization id
* @return string PLAIN Response
*/
public function getResponse($authcid, $pass, $authzid = '')
{
return $authzid . chr(0) . $authcid . chr(0) . $pass;
}
}
?>

File diff suppressed because it is too large Load Diff

29
lib/FirePHP/LICENSE Normal file
View File

@ -0,0 +1,29 @@
Software License Agreement (New BSD License)
Copyright (c) 2006-2009, Christoph Dorn
All rights reserved.
Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice,
this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of Christoph Dorn nor the names of its
contributors may be used to endorse or promote products derived from this
software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

276
lib/FirePHP/fb.php Normal file
View File

@ -0,0 +1,276 @@
<?php
/* ***** BEGIN LICENSE BLOCK *****
*
* This file is part of FirePHP (http://www.firephp.org/).
*
* Software License Agreement (New BSD License)
*
* Copyright (c) 2006-2010, Christoph Dorn
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification,
* are permitted provided that the following conditions are met:
*
* * Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* * Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* * Neither the name of Christoph Dorn nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
* ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* ***** END LICENSE BLOCK *****
*
* @copyright Copyright (C) 2007-2009 Christoph Dorn
* @author Christoph Dorn <christoph@christophdorn.com>
* @license http://www.opensource.org/licenses/bsd-license.php
* @package FirePHPCore
*/
if(!class_exists('FirePHP')) {
require_once dirname(__FILE__) . DIRECTORY_SEPARATOR . 'FirePHP.class.php';
}
/**
* Sends the given data to the FirePHP Firefox Extension.
* The data can be displayed in the Firebug Console or in the
* "Server" request tab.
*
* @see http://www.firephp.org/Wiki/Reference/Fb
* @param mixed $Object
* @return true
* @throws Exception
*/
function fb()
{
$instance = FirePHP::getInstance(true);
$args = func_get_args();
return call_user_func_array(array($instance,'fb'),$args);
}
class FB
{
/**
* Enable and disable logging to Firebug
*
* @see FirePHP->setEnabled()
* @param boolean $Enabled TRUE to enable, FALSE to disable
* @return void
*/
public static function setEnabled($Enabled)
{
$instance = FirePHP::getInstance(true);
$instance->setEnabled($Enabled);
}
/**
* Check if logging is enabled
*
* @see FirePHP->getEnabled()
* @return boolean TRUE if enabled
*/
public static function getEnabled()
{
$instance = FirePHP::getInstance(true);
return $instance->getEnabled();
}
/**
* Specify a filter to be used when encoding an object
*
* Filters are used to exclude object members.
*
* @see FirePHP->setObjectFilter()
* @param string $Class The class name of the object
* @param array $Filter An array or members to exclude
* @return void
*/
public static function setObjectFilter($Class, $Filter)
{
$instance = FirePHP::getInstance(true);
$instance->setObjectFilter($Class, $Filter);
}
/**
* Set some options for the library
*
* @see FirePHP->setOptions()
* @param array $Options The options to be set
* @return void
*/
public static function setOptions($Options)
{
$instance = FirePHP::getInstance(true);
$instance->setOptions($Options);
}
/**
* Get options for the library
*
* @see FirePHP->getOptions()
* @return array The options
*/
public static function getOptions()
{
$instance = FirePHP::getInstance(true);
return $instance->getOptions();
}
/**
* Log object to firebug
*
* @see http://www.firephp.org/Wiki/Reference/Fb
* @param mixed $Object
* @return true
* @throws Exception
*/
public static function send()
{
$instance = FirePHP::getInstance(true);
$args = func_get_args();
return call_user_func_array(array($instance,'fb'),$args);
}
/**
* Start a group for following messages
*
* Options:
* Collapsed: [true|false]
* Color: [#RRGGBB|ColorName]
*
* @param string $Name
* @param array $Options OPTIONAL Instructions on how to log the group
* @return true
*/
public static function group($Name, $Options=null)
{
$instance = FirePHP::getInstance(true);
return $instance->group($Name, $Options);
}
/**
* Ends a group you have started before
*
* @return true
* @throws Exception
*/
public static function groupEnd()
{
return self::send(null, null, FirePHP::GROUP_END);
}
/**
* Log object with label to firebug console
*
* @see FirePHP::LOG
* @param mixes $Object
* @param string $Label
* @return true
* @throws Exception
*/
public static function log($Object, $Label=null)
{
return self::send($Object, $Label, FirePHP::LOG);
}
/**
* Log object with label to firebug console
*
* @see FirePHP::INFO
* @param mixes $Object
* @param string $Label
* @return true
* @throws Exception
*/
public static function info($Object, $Label=null)
{
return self::send($Object, $Label, FirePHP::INFO);
}
/**
* Log object with label to firebug console
*
* @see FirePHP::WARN
* @param mixes $Object
* @param string $Label
* @return true
* @throws Exception
*/
public static function warn($Object, $Label=null)
{
return self::send($Object, $Label, FirePHP::WARN);
}
/**
* Log object with label to firebug console
*
* @see FirePHP::ERROR
* @param mixes $Object
* @param string $Label
* @return true
* @throws Exception
*/
public static function error($Object, $Label=null)
{
return self::send($Object, $Label, FirePHP::ERROR);
}
/**
* Dumps key and variable to firebug server panel
*
* @see FirePHP::DUMP
* @param string $Key
* @param mixed $Variable
* @return true
* @throws Exception
*/
public static function dump($Key, $Variable)
{
return self::send($Variable, $Key, FirePHP::DUMP);
}
/**
* Log a trace in the firebug console
*
* @see FirePHP::TRACE
* @param string $Label
* @return true
* @throws Exception
*/
public static function trace($Label)
{
return self::send($Label, FirePHP::TRACE);
}
/**
* Log a table in the firebug console
*
* @see FirePHP::TABLE
* @param string $Label
* @param string $Table
* @return true
* @throws Exception
*/
public static function table($Label, $Table)
{
return self::send($Table, $Label, FirePHP::TABLE);
}
}

682
lib/XmppPrebind.php Normal file
View File

@ -0,0 +1,682 @@
<?php
/**
* XMPP Prebind for PHP
*
* @copyright 2011 Amiado Group AG
* @author Michael Weibel <michael.weibel@amiadogroup.com>
*/
/**
* FirePHP for debugging
*/
include 'FirePHP/fb.php';
/**
* PEAR Auth_SASL
*/
require 'Auth/SASL.php';
/**
* XMPP Library for connecting to jabber server & receiving sid and rid
*/
class XmppPrebind {
const XMLNS_BODY = 'http://jabber.org/protocol/httpbind';
const XMLNS_BOSH = 'urn:xmpp:xbosh';
const XMLNS_CLIENT = 'jabber:client';
const XMLNS_SESSION = 'urn:ietf:params:xml:ns:xmpp-session';
const XMLNS_BIND = 'urn:ietf:params:xml:ns:xmpp-bind';
const XMLNS_SASL = 'urn:ietf:params:xml:ns:xmpp-sasl';
const XMLNS_VCARD = 'vcard-temp';
const XML_LANG = 'en';
const CONTENT_TYPE = 'text/xml charset=utf-8';
const ENCRYPTION_PLAIN = 'PLAIN';
const ENCRYPTION_DIGEST_MD5 = 'DIGEST-MD5';
const ENCRYPTION_CRAM_MD5 = 'CRAM-MD5';
const SERVICE_NAME = 'xmpp';
protected $jabberHost = '';
protected $boshUri = '';
protected $resource = '';
protected $debug = false;
/**
* FirePHP Instance
*
* @var FirePHP
*/
protected $firePhp = null;
protected $useGzip = false;
protected $useSsl = false;
protected $encryption = self::ENCRYPTION_PLAIN;
protected $jid = '';
protected $password = '';
protected $rid = '';
protected $sid = '';
protected $doSession = false;
protected $doBind = false;
protected $mechanisms = array();
// the Bosh attributes for use in a client using this prebound session
protected $wait;
protected $requests;
protected $ver;
protected $polling;
protected $inactivity;
protected $hold;
protected $to;
protected $ack;
protected $accept;
protected $maxpause;
/**
* Session creation response
*
* @var DOMDocument
*/
public $response;
/**
* Create a new XmppPrebind Object with the required params
*
* @param string $jabberHost Jabber Server Host
* @param string $boshUri Full URI to the http-bind
* @param string $resource Resource identifier
* @param bool $useSsl Use SSL (not working yet, TODO)
* @param bool $debug Enable debug
*/
public function __construct($jabberHost, $boshUri, $resource, $useSsl = false, $debug = false) {
$this->jabberHost = $jabberHost;
$this->boshUri = $boshUri;
$this->resource = $resource;
$this->useSsl = $useSsl;
$this->debug = $debug;
if ($this->debug === true) {
$this->firePhp = FirePHP::getInstance(true);
$this->firePhp->setEnabled(true);
}
/* TODO: Not working
if (function_exists('gzinflate')) {
$this->useGzip = true;
}*/
/*
* The client MUST generate a large, random, positive integer for the initial 'rid' (see Security Considerations)
* and then increment that value by one for each subsequent request. The client MUST take care to choose an
* initial 'rid' that will never be incremented above 9007199254740991 [21] within the session.
* In practice, a session would have to be extraordinarily long (or involve the exchange of an extraordinary
* number of packets) to exceed the defined limit.
*
* @link http://xmpp.org/extensions/xep-0124.html#rids
*/
if (function_exists('mt_rand')) {
$this->rid = mt_rand(1000000000, 10000000000);
} else {
$this->rid = rand(1000000000, 10000000000);
}
}
/**
* connect to the jabber server with the supplied username & password
*
* @param string $username Username without jabber host
* @param string $password Password
* @param string $route Route
*/
public function connect($username, $password, $route = false) {
$this->jid = $username . '@' . $this->jabberHost;
if($this->resource) {
$this->jid .= '/' . $this->resource;
}
$this->password = $password;
$response = $this->sendInitialConnection($route);
if(empty($response)) {
throw new XmppPrebindConnectionException("No response from server.");
}
$body = self::getBodyFromXml($response);
if ( empty( $body ) )
throw new XmppPrebindConnectionException("No body could be found in response from server.");
$this->sid = $body->getAttribute('sid');
// set the Bosh Attributes
$this->wait = $body->getAttribute('wait');
$this->requests = $body->getAttribute('requests');
$this->ver = $body->getAttribute('ver');
$this->polling = $body->getAttribute('polling');
$this->inactivity = $body->getAttribute('inactivity');
$this->hold = $body->getAttribute('hold');
$this->to = $body->getAttribute('to');
$this->accept = $body->getAttribute('accept');
$this->maxpause = $body->getAttribute('maxpause');
$this->debug($this->sid, 'sid');
if(empty($body->firstChild) || empty($body->firstChild->firstChild)) {
throw new XmppPrebindConnectionException("Child not found in response from server.");
}
$mechanisms = $body->getElementsByTagName('mechanism');
foreach ($mechanisms as $value) {
$this->mechanisms[] = $value->nodeValue;
}
if (in_array(self::ENCRYPTION_DIGEST_MD5, $this->mechanisms)) {
$this->encryption = self::ENCRYPTION_DIGEST_MD5;
} elseif (in_array(self::ENCRYPTION_CRAM_MD5, $this->mechanisms)) {
$this->encryption = self::ENCRYPTION_CRAM_MD5;
} elseif (in_array(self::ENCRYPTION_PLAIN, $this->mechanisms)) {
$this->encryption = self::ENCRYPTION_PLAIN;
} else {
throw new XmppPrebindConnectionException("No encryption supported by the server is supported by this library.");
}
$this->debug($this->encryption, 'encryption used');
// Assign session creation response
$this->response = $body;
}
/**
* Try to authenticate
*
* @throws XmppPrebindException if invalid login
* @return bool
*/
public function auth() {
$auth = Auth_SASL::factory($this->encryption);
switch ($this->encryption) {
case self::ENCRYPTION_PLAIN:
$authXml = $this->buildPlainAuth($auth);
break;
case self::ENCRYPTION_DIGEST_MD5:
$authXml = $this->sendChallengeAndBuildDigestMd5Auth($auth);
break;
case self::ENCRYPTION_CRAM_MD5:
$authXml = $this->sendChallengeAndBuildCramMd5Auth($auth);
break;
}
$response = $this->send($authXml);
$body = self::getBodyFromXml($response);
if (!$body->hasChildNodes() || $body->firstChild->nodeName !== 'success') {
throw new XmppPrebindException("Invalid login");
}
$this->sendRestart();
$this->sendBindIfRequired();
$this->sendSessionIfRequired();
return true;
}
/**
* Get BOSH parameters to properly setup the BOSH client
*
* @return array
*/
public function getBoshInfo()
{
return array(
'wait' => $this->wait,
'requests' => $this->requests,
'ver' => $this->ver,
'polling' => $this->polling,
'inactivity' => $this->inactivity,
'hold' => $this->hold,
'to' => $this->to,
'ack' => $this->ack,
'accept' => $this->accept,
'maxpause' => $this->maxpause,
);
}
/**
* Get jid, sid and rid for attaching
*
* @return array
*/
public function getSessionInfo() {
return array('jid' => $this->jid, 'sid' => $this->sid, 'rid' => $this->rid);
}
/**
* Debug if debug enabled
*
* @param string $msg
* @param string $label
*/
protected function debug($msg, $label = null) {
if ($this->firePhp) {
$this->firePhp->log($msg, $label);
}
}
/**
* Send xmpp restart message after successful auth
*
* @return string Response
*/
protected function sendRestart() {
$domDocument = $this->buildBody();
$body = self::getBodyFromDomDocument($domDocument);
$body->appendChild(self::getNewTextAttribute($domDocument, 'to', $this->jabberHost));
$body->appendChild(self::getNewTextAttribute($domDocument, 'xmlns:xmpp', self::XMLNS_BOSH));
$body->appendChild(self::getNewTextAttribute($domDocument, 'xmpp:restart', 'true'));
$restartResponse = $this->send($domDocument->saveXML());
$restartBody = self::getBodyFromXml($restartResponse);
foreach ($restartBody->childNodes as $bodyChildNodes) {
if ($bodyChildNodes->nodeName === 'stream:features') {
foreach ($bodyChildNodes->childNodes as $streamFeatures) {
if ($streamFeatures->nodeName === 'bind') {
$this->doBind = true;
} elseif ($streamFeatures->nodeName === 'session') {
$this->doSession = true;
}
}
}
}
return $restartResponse;
}
/**
* Send xmpp bind message after restart
*
* @return string Response
*/
protected function sendBindIfRequired() {
if ($this->doBind) {
$domDocument = $this->buildBody();
$body = self::getBodyFromDomDocument($domDocument);
$iq = $domDocument->createElement('iq');
$iq->appendChild(self::getNewTextAttribute($domDocument, 'xmlns', self::XMLNS_CLIENT));
$iq->appendChild(self::getNewTextAttribute($domDocument, 'type', 'set'));
$iq->appendChild(self::getNewTextAttribute($domDocument, 'id', 'bind_' . rand()));
$bind = $domDocument->createElement('bind');
$bind->appendChild(self::getNewTextAttribute($domDocument, 'xmlns', self::XMLNS_BIND));
$resource = $domDocument->createElement('resource');
$resource->appendChild($domDocument->createTextNode($this->resource));
$bind->appendChild($resource);
$iq->appendChild($bind);
$body->appendChild($iq);
return $this->send($domDocument->saveXML());
}
return false;
}
/**
* Send session if there's a session node in the restart response (within stream:features)
*/
protected function sendSessionIfRequired() {
if ($this->doSession) {
$domDocument = $this->buildBody();
$body = self::getBodyFromDomDocument($domDocument);
$iq = $domDocument->createElement('iq');
$iq->appendChild(self::getNewTextAttribute($domDocument, 'xmlns', self::XMLNS_CLIENT));
$iq->appendChild(self::getNewTextAttribute($domDocument, 'type', 'set'));
$iq->appendChild(self::getNewTextAttribute($domDocument, 'id', 'session_auth_' . rand()));
$session = $domDocument->createElement('session');
$session->appendChild(self::getNewTextAttribute($domDocument, 'xmlns', self::XMLNS_SESSION));
$iq->appendChild($session);
$body->appendChild($iq);
return $this->send($domDocument->saveXML());
}
return false;
}
/**
* Send initial connection string
*
* @param string $route
* @return string Response
*/
protected function sendInitialConnection($route = false) {
$domDocument = $this->buildBody();
$body = self::getBodyFromDomDocument($domDocument);
$waitTime = 60;
$body->appendChild(self::getNewTextAttribute($domDocument, 'hold', '1'));
$body->appendChild(self::getNewTextAttribute($domDocument, 'to', $this->jabberHost));
$body->appendChild(self::getNewTextAttribute($domDocument, 'xmlns:xmpp', self::XMLNS_BOSH));
$body->appendChild(self::getNewTextAttribute($domDocument, 'xmpp:version', '1.0'));
$body->appendChild(self::getNewTextAttribute($domDocument, 'wait', $waitTime));
if ($route)
{
$body->appendChild(self::getNewTextAttribute($domDocument, 'route', $route));
}
return $this->send($domDocument->saveXML());
}
/**
* Send challenge request
*
* @return string Challenge
*/
protected function sendChallenge() {
$domDocument = $this->buildBody();
$body = self::getBodyFromDomDocument($domDocument);
$auth = $domDocument->createElement('auth');
$auth->appendChild(self::getNewTextAttribute($domDocument, 'xmlns', self::XMLNS_SASL));
$auth->appendChild(self::getNewTextAttribute($domDocument, 'mechanism', $this->encryption));
$body->appendChild($auth);
$response = $this->send($domDocument->saveXML());
$body = $this->getBodyFromXml($response);
$challenge = base64_decode($body->firstChild->nodeValue);
return $challenge;
}
/**
* Build PLAIN auth string
*
* @param Auth_SASL_Common $auth
* @return string Auth XML to send
*/
protected function buildPlainAuth(Auth_SASL_Common $auth) {
$authString = $auth->getResponse(self::getNodeFromJid($this->jid), $this->password, self::getBareJidFromJid($this->jid));
$authString = base64_encode($authString);
$this->debug($authString, 'PLAIN Auth String');
$domDocument = $this->buildBody();
$body = self::getBodyFromDomDocument($domDocument);
$auth = $domDocument->createElement('auth');
$auth->appendChild(self::getNewTextAttribute($domDocument, 'xmlns', self::XMLNS_SASL));
$auth->appendChild(self::getNewTextAttribute($domDocument, 'mechanism', $this->encryption));
$auth->appendChild($domDocument->createTextNode($authString));
$body->appendChild($auth);
return $domDocument->saveXML();
}
/**
* Send challenge request and build DIGEST-MD5 auth string
*
* @param Auth_SASL_Common $auth
* @return string Auth XML to send
*/
protected function sendChallengeAndBuildDigestMd5Auth(Auth_SASL_Common $auth) {
$challenge = $this->sendChallenge();
$authString = $auth->getResponse(self::getNodeFromJid($this->jid), $this->password, $challenge, $this->jabberHost, self::SERVICE_NAME);
$this->debug($authString, 'DIGEST-MD5 Auth String');
$authString = base64_encode($authString);
$domDocument = $this->buildBody();
$body = self::getBodyFromDomDocument($domDocument);
$response = $domDocument->createElement('response');
$response->appendChild(self::getNewTextAttribute($domDocument, 'xmlns', self::XMLNS_SASL));
$response->appendChild($domDocument->createTextNode($authString));
$body->appendChild($response);
$challengeResponse = $this->send($domDocument->saveXML());
return $this->replyToChallengeResponse($challengeResponse);
}
/**
* Send challenge request and build CRAM-MD5 auth string
*
* @param Auth_SASL_Common $auth
* @return string Auth XML to send
*/
protected function sendChallengeAndBuildCramMd5Auth(Auth_SASL_Common $auth) {
$challenge = $this->sendChallenge();
$authString = $auth->getResponse(self::getNodeFromJid($this->jid), $this->password, $challenge);
$this->debug($authString, 'CRAM-MD5 Auth String');
$authString = base64_encode($authString);
$domDocument = $this->buildBody();
$body = self::getBodyFromDomDocument($domDocument);
$response = $domDocument->createElement('response');
$response->appendChild(self::getNewTextAttribute($domDocument, 'xmlns', self::XMLNS_SASL));
$response->appendChild($domDocument->createTextNode($authString));
$body->appendChild($response);
$challengeResponse = $this->send($domDocument->saveXML());
return $this->replyToChallengeResponse($challengeResponse);
}
/**
* CRAM-MD5 and DIGEST-MD5 reply with an additional challenge response which must be replied to.
* After this additional reply, the server should reply with "success".
*/
protected function replyToChallengeResponse($challengeResponse) {
$body = self::getBodyFromXml($challengeResponse);
$challenge = base64_decode((string)$body->firstChild->nodeValue);
if (strpos($challenge, 'rspauth') === false) {
throw new XmppPrebindConnectionException('Invalid challenge response received');
}
$domDocument = $this->buildBody();
$body = self::getBodyFromDomDocument($domDocument);
$response = $domDocument->createElement('response');
$response->appendChild(self::getNewTextAttribute($domDocument, 'xmlns', self::XMLNS_SASL));
$body->appendChild($response);
return $domDocument->saveXML();
}
/**
* Send XML via CURL
*
* @param string $xml
* @return string Response
*/
protected function send($xml) {
$ch = curl_init($this->boshUri);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $xml);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
$header = array('Content-Type: ' . self::CONTENT_TYPE);
if ($this->useGzip) {
$header[] = 'Accept-Encoding: gzip, deflate';
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $header);
curl_setopt($ch, CURLOPT_VERBOSE, 0);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$response = curl_exec($ch);
// Check if curl failed to get response
if ($response === false) {
throw new XmppPrebindConnectionException("Cannot connect to service");
}
curl_close($ch);
if ($this->useGzip) {
$response = self::compatibleGzInflate($response);
}
$this->debug($xml, 'SENT');
$this->debug($response, 'RECV:');
return $response;
}
/**
* Fix gzdecompress/gzinflate data error warning.
*
* @link http://www.mydigitallife.info/2010/01/17/workaround-to-fix-php-warning-gzuncompress-or-gzinflate-data-error-in-wordpress-http-php/
*
* @param string $gzData
* @return string|bool
*/
public static function compatibleGzInflate($gzData) {
if ( substr($gzData, 0, 3) == "\x1f\x8b\x08" ) {
$i = 10;
$flg = ord( substr($gzData, 3, 1) );
if ( $flg > 0 ) {
if ( $flg & 4 ) {
list($xlen) = unpack('v', substr($gzData, $i, 2) );
$i = $i + 2 + $xlen;
}
if ( $flg & 8 )
$i = strpos($gzData, "\0", $i) + 1;
if ( $flg & 16 )
$i = strpos($gzData, "\0", $i) + 1;
if ( $flg & 2 )
$i = $i + 2;
}
return gzinflate( substr($gzData, $i, -8) );
} else {
return false;
}
}
/**
* Build DOMDocument with standard xmpp body child node.
*
* @return DOMDocument
*/
protected function buildBody() {
$xml = new DOMDocument('1.0', 'UTF-8');
$body = $xml->createElement('body');
$xml->appendChild($body);
$body->appendChild(self::getNewTextAttribute($xml, 'xmlns', self::XMLNS_BODY));
$body->appendChild(self::getNewTextAttribute($xml, 'content', self::CONTENT_TYPE));
$body->appendChild(self::getNewTextAttribute($xml, 'rid', $this->getAndIncrementRid()));
$body->appendChild(self::getNewTextAttribute($xml, 'xml:lang', self::XML_LANG));
if ($this->sid != '') {
$body->appendChild(self::getNewTextAttribute($xml, 'sid', $this->sid));
}
return $xml;
}
/**
* Get jid in form of username@jabberHost
*
* @param string $jid Jid in form username@jabberHost/Resource
* @return string JID
*/
public static function getBareJidFromJid($jid) {
if ($jid == '') {
return '';
}
$splittedJid = explode('/', $jid, 1);
return $splittedJid[0];
}
/**
* Get node (username) from jid
*
* @param string $jid
* @return string Node
*/
public static function getNodeFromJid($jid) {
$atPos = strpos($jid, '@');
if ($atPos === false) {
return '';
}
return substr($jid, 0, $atPos);
}
/**
* Append new attribute to existing DOMDocument.
*
* @param DOMDocument $domDocument
* @param string $attributeName
* @param string $value
* @return DOMNode
*/
protected static function getNewTextAttribute($domDocument, $attributeName, $value) {
$attribute = $domDocument->createAttribute($attributeName);
$attribute->appendChild($domDocument->createTextNode($value));
return $attribute;
}
/**
* Get body node from DOMDocument
*
* @param DOMDocument $domDocument
* @return DOMNode
*/
protected static function getBodyFromDomDocument($domDocument) {
$body = $domDocument->getElementsByTagName('body');
return $body->item(0);
}
/**
* Parse XML and return DOMNode of the body
*
* @uses XmppPrebind::getBodyFromDomDocument()
* @param string $xml
* @return DOMNode
*/
protected static function getBodyFromXml($xml) {
$domDocument = new DOMDocument();
$domDocument->loadXml($xml);
return self::getBodyFromDomDocument($domDocument);
}
/**
* Get the rid and increment it by one.
* Required by RFC
*
* @return int
*/
protected function getAndIncrementRid() {
return $this->rid++;
}
}
/**
* Standard XmppPrebind Exception
*/
class XmppPrebindException extends Exception{}
class XmppPrebindConnectionException extends XmppPrebindException{}

View File

@ -7,6 +7,8 @@
<link rel="alternate stylesheet" type="text/css" media="screen" title="white" href="css/white.css" />
<link rel="alternate stylesheet" type="text/css" media="screen" title="blue" href="css/blue.css" />
<link rel="alternate stylesheet" type="text/css" media="screen" title="red" href="css/red.css" />
<link rel="stylesheet" type="text/css" media="screen" href="css/converse.min.css">
<script src="builds/converse.min.js"></script>
<script type="text/javascript">
window.onload=function(){
var formref=document.getElementById("switchform")
@ -121,4 +123,48 @@ if ($squeezevisible > "0") {
</div>
</div>
</body>
<script>
require(['converse'], function (converse) {
(function () {
/* XXX: This function initializes jquery.easing for the https://conversejs.org
* website. This code is only useful in the context of the converse.js
* website and converse.js itself is NOT dependent on it.
*/
var $ = converse.env.jQuery;
$.extend( $.easing, {
easeInOutExpo: function (x, t, b, c, d) {
if (t==0) return b;
if (t==d) return b+c;
if ((t/=d/2) < 1) return c/2 * Math.pow(2, 10 * (t - 1)) + b;
return c/2 * (-Math.pow(2, -10 * --t) + 2) + b;
},
});
$(window).scroll(function() {
if ($(".navbar").offset().top > 50) {
$(".navbar-fixed-top").addClass("top-nav-collapse");
} else {
$(".navbar-fixed-top").removeClass("top-nav-collapse");
}
});
//jQuery for page scrolling feature - requires jQuery Easing plugin
$('.page-scroll a').bind('click', function(event) {
var $anchor = $(this);
$('html, body').stop().animate({
scrollTop: $($anchor.attr('href')).offset().top
}, 700, 'easeInOutExpo');
event.preventDefault();
});
})();
converse.initialize({
bosh_service_url: 'https://konvos.cf:5281/http-bind', // Please use this connection manager only for testing purposes
keepalive: true,
message_carbons: true,
play_sounds: true,
roster_groups: true,
show_controlbox_by_default: true,
xhr_user_search: false
});
});
</script>
</html>

View File

@ -9,7 +9,6 @@
<link rel="alternate stylesheet" type="text/css" media="screen" title="blue" href="css/blue.css" />
<link rel="alternate stylesheet" type="text/css" media="screen" title="red" href="css/red.css" />
<link rel="alternate stylesheet" type="text/css" media="screen" title="custom" href="css/custom.php" />
<script type="text/javascript">
window.onload=function(){
var formref=document.getElementById("switchform")
@ -53,6 +52,14 @@ if ($clockvisible > "0") {
require "clock.php";
} else {
}
?>
</p>
<?php
if ($konvosvisible > "0") {
require "konvos.php";
} else {
}
?>
</p>