Jabber

15 posts
npetrele

PHP and Cisco IM&P EPASSoap

Posted by npetrele Jul 25, 2017

PHP and Cisco IM&P EPASSoap

 

If you want to integrate Jabber/XMPP access to Cisco IM&P within a web application, the best way to do that is to use Cisco Jabber SDK, also known as CAXL, a Javascript library.

 

However, there are times when you want to put together simple web or command-line applications and utilities that make use of XMPP.  JAXL (an open source project, not Cisco) is a good way to do that with PHP.  With a little easy tweaking, it works fine with Cisco IM&P XMPP servers.  And, while not being as comprehensive as Jabber SDK, PHP is often easier to work with than Javascript if what you want is basic XMPP IM and Presence functionality.

 

You can find instructions on how to use JAXL on Windows 10 with Cisco IM&P here.  It works find on Linux, too, minus some of the adjustments we made to make it work on Windows 10.

 

Adding EPASSoap to PHP and JAXL

 

As of June 5, the date we published the JAXL blog post, JAXL lacked some features and probably still does. JAXL doesn't have the ability to add and delete contacts, for example.  You could add these features to JAXL, but that would require building various stanzas, which can by tricky. Fortunately, you can use Cisco EPASSoap and PHP to add these and other features. You can find documentation on EPASSoap here.

 

I've attached a complete sample PHP application to this blog post. It includes more than what you will see in this blog post.

 

In this blog post, we'll be using the tips documented here. These tips show you how to view the SOAP XML that your application will send, and dump the status that is returned to the web browser.

 

Establishing Your Client

 

First, you'll need a username/password for a person with the privileges necessary to access Cisco IM&P via SOAP so you can do basic authentication.

 

Then you'll need the username/password of an application user, and the username (no password needed) of the end user for which you want to do things like add/remove contacts.

 

What follows is the code that creates the modified PHP SOAP client to allow us to see the XML it sends. (Note: Lines are artificially broken to prevent having to scroll sample code and sample XML)

 

<?php
$host = "your-cimp-server.com";
$username = "basic auth user";
$password = "basic auth password";
$locationURL = "https://".$host."/EPASSoap/service/v105";
$wsdlURL = "https://".urlencode($username).":".
     urlencode($password)."@".$host."/EPASSoap/service/v105?wsdl";
$showresponse = true;
$appusername = "appusername";
$appuserpass = "appuserpassword";
$endusername = "endusername";

class MySoapClient extends SoapClient {
     public $sendRequest = true;
     public $printRequest = false;
     public $formatXML = false;

     public function __doRequest($request, $location, $action, 
                                        $version, $one_way = 0) {
          if ($this->printRequest) {
               if (!$this->formatXML) {
                    $out = $request;
               } else {
                    $doc = new DOMDocument;
                    $doc->preserveWhiteSpace = false;
                    $doc->loadxml($request);
                    $doc->formatOutput = true;
                    $out = $doc->savexml();
               }
               echo "<pre>";
               echo htmlspecialchars($out);
               echo "</pre>";
          }

          if ($this->sendRequest) {
               return parent::__doRequest($request, $location, 
                              $action, $version, $one_way);
          } else {
               return '';
          }
     }
}

$clientClass = 'MySoapClient';

$context = stream_context_create([
     'ssl' => [
          // set some SSL/TLS specific options
          'verify_peer' => false,
          'verify_peer_name' => false,
          'allow_self_signed' => true,
     ]
]);

$client = new $clientClass($wsdlURL,
          array(
               'soap_version' => SOAP_1_2,
               'trace' => true,
               'exceptions' => true,
               'location' => $locationURL,
               'stream_context' => $context,
               'login' => $username,
               'password' => $password));
               
$client->sendRequest = true;
$client->printRequest = true;
$client->formatXML = true;

 

Notice the variable $showresponse.  Set this to true, and when a SOAP request returns the response, the app will dump the entire $response object to the web browser so you can examine every detail. Here's how it works:

 

if ($showresponse) {
     echo "<pre>";
     var_dump($response);
     echo "</pre>";
}

 

Two PHP Gotchas

 

Before we continue, let's look at two common problems you'll have to deal with when using PHP and SOAP.

 

PHP and Hyphens

 

PHP does not allow method names or variable names with a hyphen in them. EPASSoap requires a number of methods with hyphens, so we need to work around that problem. The solution is simple enough. For example, instead of coding this, which will fail:

 

     $ausessionkey = $response->success->session-key;

 

Code it this way:

 

     $ausessionkey = $response->success->{'session-key'};

 

PHP SOAP and XML Attributes

 

EPASSoap requests often use XML attributes as well as values.  For example:

 

<persona-id domain="cisco.com">Reed</persona-id>

 

And...

 

<group old-name="Group" new-name="New Group"/>

 

There are at least a couple of ways of dealing with this issue, but here's what I find to be easiest. In the former case, where there's a domain attribute, you can set the attribute and the value this way:

 

"persona-id" => array("_" => "Reed", "domain"=>$domain)

 

In the latter case, when you have a tag that only includes attributes and no value, you can define it this way (set "_" to an empty string "").

 

$group = array("group" => array(
          "_" => "", "old-name"=>"Newer Group", "new-name"=>"New Group")
          );

 

Logging In and Getting Session IDs

 

An application user doesn't have any groups or contacts.  But in order to manipulate an end user's groups and contact, you need to get an application user's session key and use it to log in the end user. When you log in the end user, you use the end user's session key to perform operation on that end user's contacts and groups.

 

Let's log in the application user first, then.

 

$appUserLogin = array(
          "client-type" => "thirdpartyapp",
          "username" => $appusername,
          "password" => $appuserpass);

try {
     $response = $client->login($appUserLogin);
} catch (SoapFault $sf) {
     echo "SoapFault: ".$sf."<BR>";
}
catch (Exception $e) {
     echo "Exception: ".$e."<BR>";
}

if ($response->success)
     $ausessionkey = $response->success->{'session-key'};
else
     echo "No session key returned <BR>";
     exit();

 

Now we should have the application user session key in the variable $ausessionkey. We'll need to put the application user's session key in the soap header in order to log in the end user.

 

     
$objHeader = new SoapHeader('urn:cisco:epas:soap', 'session-key', $ausessionkey);
$client->__setSoapHeaders(array($objHeader));

 

Before we log in end user, let's get the domain set in the Cisco IM&P.  We may need this value later.  You may already know the domain, and you can just type it yourself anywhere it is needed in your app. But here's a handy way to get it into a variable via EPASSoap. This assumes there's only one domain, which is usually the case.

 

try {
     $response = $client->{'get-im-domains'}();
} catch (SoapFault $sf) {
     echo "SoapFault: ".$sf."<BR>";
}
catch (Exception $e) {
     echo "Exception: ".$e."<BR>";
}

$domain = $response->domain->name;

 

Now let's log in the end user. No need to set the SoapHeader to the application user session key again. It remains set until we clear it.

 

$endUserLogin = array(
          "client-type" => "thirdclient",
          "username" => $endusername,
          "app-session-id" => $ausessionkey);

try {
     $response = $client->login($endUserLogin);
} catch (SoapFault $sf) {
     echo "SoapFault: ".$sf."<BR>";
}
catch (Exception $e) {
     echo "Exception: ".$e."<BR>";
}

if ($response->success)
     $eusessionkey = $response->success->{'session-key'};
else
     exit();

 

Now we have the end user session key stored in the variable $eusessionkey. This is what we use to perform the rest of the end user operations.

 

Let's set the header to use this session key. First, however, we have to clear out the old application user session key.

 

// clear out the application user session key

$client->__setSoapHeaders(null);

// now set the end user session key in the header
$objHeader = new SoapHeader('urn:cisco:epas:soap', 'session-key', $eusessionkey);
$client->__setSoapHeaders(array($objHeader));

 

Manipulating End User Contacts

 

Here's how to add the Jabber user Reed (JID Reed@somedomain.com) to your roster in the group called "Contacts".

 

This is the XML we want to send as the request:

 

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" 
                         xmlns:ns1="urn:cisco:epas:soap">
  <env:Header>
    <ns1:session-key>end-user-session-key</ns1:session-key>
  </env:Header>
  <env:Body>
    <ns1:add-contact>
      <ns1:group name="Contacts">
        <ns1:persona-id domain="somedomain.com">Reed</ns1:persona-id>
      </ns1:group>
    </ns1:add-contact>
  </env:Body>
</env:Envelope>

 

Here's how to construct that request using PHP SOAP:

 

$contact = array(
          "group" => array("name" => "Contacts",
                         "persona-id" => array("_" => "Reed", "domain"=>$domain)
                              )
                    );

try {
     $response = $client->{'add-contact'}($contact);
} catch (SoapFault $sf) {
     echo "SoapFault: ".$sf."<BR>";
} catch (Exception $e) {
     echo "Exception: ".$e."<BR>";
}

echo "Return status: ".$response->status->{'_'} . "<BR>";

 

It's as simple as that. Now let's tackle something like renaming a roster group.  Here's the XML request we want to create with the SOAP client:

 

<?xml version="1.0" encoding="UTF-8"?>
<env:Envelope xmlns:env="http://www.w3.org/2003/05/soap-envelope" 
               xmlns:ns1="urn:cisco:epas:soap">
  <env:Header>
    <ns1:session-key>end-user-session-key</ns1:session-key>
  </env:Header>
  <env:Body>
    <ns1:modify-group>
      <ns1:group old-name="Group" new-name="New Group"/>
    </ns1:modify-group>
  </env:Body>
</env:Envelope>

 

Now here's how to create that with PHP soap:

 

$group = array("group" => array("_" => "", "old-name"=>"Group", 
          "new-name"=>"New Group"));

try {
     $response = $client->{'modify-group'}($group);
} catch (SoapFault $sf) {
     echo "SoapFault: ".$sf."<BR>";
} catch (Exception $e) {
     echo "Exception: ".$e."<BR>";
}

echo "Return status: ".$response->status->{'_'} . "<BR>";

 

Some final notes:

 

  1. If you add a user to a group that does not exist, the group is created automatically.
  2. If you delete a user from a group and that leaves the group empty, the group is automatically removed.
  3. It is the responsibility of your graphical user interface (if you create one) to update the roster when you make changes.

 

I hope you'll peruse and try out the sample application attached to this blog post. Just plug in the values appropriate to your installation, and it should be ready to run.

PHP and Cisco SOAP Services

 

I'll be posting a blog entry soon that shows how to add missing features to PHP and JAXL by using Cisco IM&P's EPASSoap service. EPASSoap lets you add contacts, modify contacts, remove contacts, among many other things. In preparation for that blog post, here are some useful tips for developing PHP applications with Cisco SOAP services.

 

If you take a look at our AXL PHP Primer, you'll see that the soap client accesses the AXL WSDL as a file. That's because you can download the WSDL and other necessary files from CUCM this way:

 

Select from the GUI menu Application->Plugins

 

Click Find and then download the Cisco AXL Toolkit.

 

There is no equivalent download for WSDLs for other Cisco soap services.  While there are tricks you can play to download Cisco WSDLs, here's how to access them in the PHP soap client via the web.

 

Assuming you want to access the EPASSoap WSDL, you can direct the PHP soap client to the URL like this, where username and password refer to an account with access to the services (such as the administrator account):

 

$wsdlURL = "https://".urlencode($username).":".urlencode($password)."@".
               $host."/EPASSoap/service/v105?wsdl";

 

Now you can instantiate a SOAP client this way:

 

$client = new SoapClient($wsdlURL,
          array(
               'soap_version' => SOAP_1_2,
               'trace' => true,
               'exceptions' => true,
               'location' => $locationURL,
               'stream_context' => $context,
               'login' => $username,
               'password' => $password));

 

Note that we define the soap version as 1.2.  Most Cisco SOAP services use soap 1.1, which is the default for the PHP SOAP client. EPASSoap requires 1.2, so we need to specify 1.2 in the client parameters.

 

We're not home clear yet, though.  Many Cisco IM&P servers use self-signed certificates, so we need to set up some context parameters to allow https access to the WSDL.

 

Before you instantiate the SOAP client above, you need to set up the stream_context.  Here's one approach that works for our lab:

 

$context = stream_context_create([
     'ssl' => [
          // set some SSL/TLS specific options
          'verify_peer' => false,
          'verify_peer_name' => false,
          'allow_self_signed' => true,
     ]
]);

 

Assuming you've got all the other parameters set correctly, you should be able to construct a client that connects and can communicate with the server.

 

But wait, there's more!   Let's extend the PHP SoapClient to add a few new features.

 

  • The option to send or not send a SOAP request
  • The option to print the request XML
  • The option to print the request XML in a way that's formatted for easy reading

 

These added features make it easy to experiment by viewing the XML requests without necessarily sending them to the server. Optionally, you can preview the XML requests and still send them. Just enable/disable the options at your convenience.

 

In the sample below, the extended SoapClient behaves the same as the standard PHP SoapClient unless otherwise specified.  And we do specify otherwise after instantiating the client.

 

Working Sample

<?php
$host = "CIMP Server";
$username = "username";
$password = "password";
$locationURL = "https://".$host."/EPASSoap/service/v105";
$wsdlURL = "https://".urlencode($username).":".urlencode($password)."@".
               $host."/EPASSoap/service/v105?wsdl";

class MySoapClient extends SoapClient {
     public $sendRequest = true;
     public $printRequest = false;
     public $formatXML = false;

     public function __doRequest($request, $location, $action, 
                                        $version, $one_way = 0) {
          if ($this->printRequest) {
               if (!$this->formatXML) {
                    $out = $request;
               } else {
                    $doc = new DOMDocument;
                    $doc->preserveWhiteSpace = false;
                    $doc->loadxml($request);
                    $doc->formatOutput = true;
                    $out = $doc->savexml();
               }
               echo "<pre>";
               echo htmlspecialchars($out);
               echo "</pre>";
          }

          if ($this->sendRequest) {
               return parent::__doRequest($request, $location, 
                                                  $action, $version, $one_way);
          } else {
               return '';
          }
     }
}

$clientClass = 'MySoapClient';

$context = stream_context_create([
     'ssl' => [
          // set some SSL/TLS specific options
          'verify_peer' => false,
          'verify_peer_name' => false,
          'allow_self_signed' => true,
     ]
]);

$client = new $clientClass($wsdlURL,
          array(
               'soap_version' => SOAP_1_2,
               'trace' => true,
               'exceptions' => true,
               'location' => $locationURL,
               'stream_context' => $context,
               'login' => $username,
               'password' => $password));
               
$client->sendRequest = false;
$client->printRequest = true;
$client->formatXML = true;

 

Now stay tuned for how we're going to use this with EPASSoap in an upcoming blog post.

npetrele

PHP and Cisco IM&P (Jabber)

Posted by npetrele Jun 5, 2017

PHP and Cisco IM&P (Jabber)

 

If you want to integrate Jabber/XMPP access to Cisco IM&P within a web application, the best way to do that is to use Cisco Jabber SDK, also known as CAXL, a Javascript library.

 

However, there are times when you want to put together simple web or command-line applications and utilities that make use of XMPP.  JAXL (an open source project, not Cisco) is a good way to do that with PHP.  With a little easy tweaking, it works fine with Cisco IM&P XMPP servers.  And, while not being as comprehensive as Jabber SDK, PHP is often easier to work with than Javascript if what you want is basic XMPP IM and Presence functionality.

 

What follows are instructions for getting JAXL installed and working, along with two sample applications.  One sample application is a modified version of an example program that comes with JAXL.  This sample is an echo bot.  You log in as a Jabber user when you run it, and whenever you send a message to that Jabber user, it will be echoed back to you. The other sample application is a simple command-line program to send an instant message.  This is an easy way to invoke a message alert from other applications.

 

All the instructions below are for Windows 10.

 

INSTALL AND CONFIGURE PHP

 

Download and install PHP.  I recommend the latest version which is currently 7.1.2.

 

All of the instructions below assume you install php in the directory C:\php.  Modify the instructions for your installation if necessary.

 

I recommend you start by copying the file php.ini-development to php.ini.  You can copy php.ini-production to php.ini and make the needed edits when you're ready to put your project into production.

 

Edit your php.ini file to enable a number of extensions you'll need.  These are all the extensions I have enabled in PHP 7.1.2.  Not all of them are needed for JAXL, but I use PHP for other projects, too. You may want to enable other extensions if you're using typical services like MySQL or PostgreSQL.

 

You'll need curl if you intend to use HTTP/BOSH for your Jabber connection.  You need openssl for authentication.  Enable all the other extensions below the comments except maybe sqlite3 (unless you intend to use sqlite).  You don't need SOAP for JAXL, but it comes in handy for other Cisco APIs.

 

;extension=php_bz2.dll
extension=php_curl.dll
;extension=php_fileinfo.dll
;extension=php_ftp.dll
;extension=php_gd2.dll
;extension=php_gettext.dll
;extension=php_gmp.dll
;extension=php_intl.dll
;extension=php_imap.dll
;extension=php_interbase.dll
;extension=php_ldap.dll
;extension=php_mbstring.dll
;extension=php_exif.dll      ; Must be after mbstring as it depends on it
;extension=php_mysqli.dll
;extension=php_oci8_12c.dll  ; Use with Oracle Database 12c Instant Client
extension=php_openssl.dll
;extension=php_pdo_firebird.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
;extension=php_pdo_sqlite.dll
;extension=php_pgsql.dll
;extension=php_shmop.dll

; The MIBS data available in the PHP distribution must be installed.
; See http://www.php.net/manual/en/snmp.installation.php
;extension=php_snmp.dll

extension=php_soap.dll
extension=php_sockets.dll
;extension=php_sqlite3.dll
extension=php_tidy.dll
extension=php_xmlrpc.dll
extension=php_xsl.dll

 

 

INSTALLING JAXL

 

You should install JAXL using a PHP dependency manager called Composer.  See the link below.

 

I do not recommend downloading and running the Composer-Setup.exe from the linked page.  The PHP installation commands are more reliable.  Copy each line from the page linked below and run each one from your PHP directory.

 

I am not including those PHP commands here because they change with new versions.  You should get the commands from the linked page.

 

https://getcomposer.org/download/

 

The instructions on this next page ensures you always get the latest version of Composer . These instructions, however, are based on unix/Linux shell commands, not Windows shells.

 

https://getcomposer.org/doc/faqs/how-to-install-composer-programmatically.md

 

Once Composer is installed, change to the php directory and run:

 

php composer.phar require "jaxl/jaxl=^3.1.0"

 

You should see something like this (on Windows you will also see a number of cryptic looking escape characters):

 

./composer.json has been created
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing jaxl/jaxl (v3.1.0): DownloadinDownloading (100%)
jaxl/jaxl suggests installing ext-pcntl (Interrupt JAXL with signals)
Writing lock file
Generating autoload files

 

 

Now that JAXL is installed, change to your php subdirectory \php\vendor\jaxl\jaxl\src\JAXL

 

Edit jaxl.php and change this:

 

     $this->require_xep('0206');

 

To this:

 

     $this->require_xep(array('0206'));

 

Reason: The require_xep method takes an array as an argument.  There are other possible fixes, but this is the simplest.  This should fix any problems you might have connecting using HTTP/BOSH. However, if you intend to use BOSH, we strongly recommend that you use Cisco Jabber SDK (CAXL) instead of JAXL.  If you use Jabber SDK or simply use JAXL with an XMPP connection (not BOSH), you don't need to make the above change, because it will never be used.

 

 

Now change to the subdirectory .\xmpp

 

Edit xmpp_stream.php and change this:

 

case 'PLAIN':
case 'X-OAUTH2':
     $stanza->t(base64_encode("\x00".$user."\x00".$pass));
     break;

 

To this:

 

case 'PLAIN':
     $stanza->t(base64_encode($user."\x00".substr($user,0,strpos($user,'@'))."\x00".$pass));
     break;
case 'X-OAUTH2':
     $stanza->t(base64_encode("\x00".$user."\x00".$pass));
     break;

 

Reason: Many, if not most XMPP servers (including Cisco IM&P) use a base64 encoding of a combination of JID, USERNAME and PASSWORD for PLAIN authentication.  In this case, $user is actually the jid, so I just substring it to get the username.  I haven’t tried it with X-OAUTH2, so I don’t know if the change applies to that, as well.  So I just separated the two.

 

 

RUNNING EXAMPLES IN THE EXAMPLES DIRECTORY

 

Change to the php subdirectory php\vendor\jaxl\jaxl\examples

 

If you want to run some of the examples from here, you'll need to make a couple modifications.

 

Normally, you run the JAXL examples from the parent directory and specify the path in your command, like php examples\some-example.php.  Personally, I like to save typing and run the examples from the examples directory.

 

Edit php\vendor\jaxl\jaxl\examples\_bootstrap.php to make sure it can find your autoload.php file and can find all of the dependencies when you run the examples from within the examples directory.

 

Add a comma and the bottom line to this code to make it possible to run the examples in the examples directory:

 

foreach (array(
     dirname(__FILE__) . '/../../autoload.php',
     dirname(__FILE__) . '/../vendor/autoload.php',
     dirname(__FILE__) . '/vendor/autoload.php',  // add comma
     dirname(__FILE__) . '/../../../autoload.php' // add this line

 

 

EXAMPLE PROGRAM: MESSAGE.PHP

 

This is a simple message sending application (you'll find a proper version attached as message.php; this is simplified).

 

All this does is send a message you specify on the command line to a user you specify on the command line.  It sends the message and exits.

 

This is not only a useful example for JAXL, it's actually useful in practice.  This is suitable to send alerts via Jabber.  For example, if you have an application that runs into a network problem, you could have your application run this simple program to send a message like "Application lost connection to server" to an IT worker.

 

Here is the simplified sample code:

 

<?php

// Run as:
// php message.php userJid password destinationJid "message in quotes"

// Get all the needed dependencies
require dirname(__FILE__) . '/_bootstrap.php';

// Get the destination Jid and the message from the command line
if ($argc < 5) {
    echo "Usage: $argv[0] jid pass to message".PHP_EOL;
    exit;
} else {
     $message = $argv[4];
     $tojid = $argv[3];
}

//
// initialize JAXL object with initial config
// based on the command line arguments
//
$client = new JAXL(array(
    'jid' => $argv[1],
    'pass' => $argv[2],
     
     // If your Cisco IM&P server address is different than the domain in your Jid
     // then you should uncomment and define this
     // For example, our lab uses a Jid like nicholas@cisco.com, 
     // but the host is ds-cup11-5.cisco.com, not cisco.com,
     // so we would define the host here to be ds-cup11-5.cisco.com
    //'host' => 'Your Cisco IM&P server',

     // authorization will default to PLAIN
    'auth_type' => 'PLAIN',

     // get debug output just for kicks
    'log_level' => JAXLLogger::DEBUG  // INFO is default
));

//
// required XEP's
//
$client->require_xep(array(
    '0199'  // XMPP Ping
));

//
// add necessary event callbacks here
//
function on_disconnect_callback()
{
    JAXLLogger::info("got on_disconnect cb");
}
$client->add_cb('on_disconnect', 'on_disconnect_callback');

function on_auth_success_callback()
{
    global $client;
     global $message;
     global $tojid;
    JAXLLogger::info("got on_auth_success cb, jid ".$client->full_jid->to_string());

     $client->send_chat_msg($tojid, $message, null, null);
    $client->send_end_stream();
}
$client->add_cb('on_auth_success', 'on_auth_success_callback');

function on_auth_failure_callback($reason)
{
    global $client;

    $client->send_end_stream();
    JAXLLogger::info("got on_auth_failure cb with reason $reason");
}
$client->add_cb('on_auth_failure', 'on_auth_failure_callback');

//
// finally start configured xmpp stream
//
$client->start();

echo "done".PHP_EOL;

 

 

EXAMPLE PROGRAM: ECHO_BOT_CISCO.PHP

 

This one is an echo bot (it logs in as a Jabber user, and echos back whatever messages you send to that user).  The file is echo_bot_cisco.php.

 

See the attached file echo_bot_cisco.php to view this one.

 

Here's how to create it yourself from the sample echo_bot.php.

 

Edit echo_bot.php and save it as echo_bot_cisco.php.

 

First, we'll need to start JAXL differently, because we're not using unix sockets on Windows 10.  We also don't want the debug shell.

 

Change this (this is near the bottom of the file):

 

$client->start(array(
    '--with-debug-shell' => true,
    '--with-unix-sock' => true
));

 

To this:

 

$client->start();

 

Let's get some more informative output when running the echo bot.  This is near the top of the file.

 

Change this:

 

    'log_level' => JAXLLogger::INFO

 

To this:

 

     
    'log_level' => JAXLLogger::DEBUG

 

Let's get rid of the outdated vCard queries, too.  Otherwise your echo bot may hang while trying to get a vCard.

 

Comment out this code:

 

    // fetch vcard
//    $client->get_vcard();

 

Comment out this code, too, like this:

 

/*
    if ($type == "available") {
        // fetch vcard
        $client->get_vcard($stanza->from);
    }
*/     

 

The default show value for your echo bot is "dnd" (Do Not Disturb).  Let's change it to "available", which in XMPP terms is actually an empty string.  The "available!" string is actually a custom status, which could be anything, like "Out to lunch".

 

Change this:

 

    $client->set_status("available!", "dnd", 10);

 

To this:

 

    $client->set_status("available!", "", 10);

 

Finally, the echo bot assumes the host value is the same as the domain in your JID (username@domain).  Depending upon how you have your Cisco IM&P server set up, your host may not equal your JID domain.  For example, in our lab, we use the domain cisco.com, but the CIMP host is actually ds-cup11-5.cisco.com. So I edited the configuration at the top of the PHP file to this:

 

$client = new JAXL(array(
    // (required) credentials
    'jid' => $argv[1],
    'pass' => $argv[2],

    // (optional) srv lookup is done if not provided
    'host' => 'ds-cup11-5.cisco.com',

 

Now you're ready to run the echo bot and try it out.  Assuming your JID is carlotta@tendant.com and your password is tendant, run it this way:

 

php echo_bot.php carlotta@tendant.com tendant

 

You could specify an authorization type as the third argument, but our lab is fine with the default PLAIN.

 

Open another client and send some messages to carlotta@tendant.com.  They should be echoed back to you.  Once you have this working, you'll know what to look out for and create a solid base on which to build a more complex application.

You can find the latest Jabber SDK (CAXL) demo attached to this blog post.  This is a reasonably feature-complete demo of Jabber SDK. Since it is a pretty massive overhaul of the last version of the Demo, you will almost certainly find bugs.  Please provide feedback so we can fix them.

 

You can edit the demoConfig section in JabberDemo.html to define you server, username, etc.  That way, all the login information will appear automatically in the login window.  Or you can simply fill out that information in the login window each time.

 

There are a lot of changes since the last time we posted a new Jabber SDK Demo.

 

Updates:

 

* It now generates a random resource caxl_(random number) so that you can login with the same account using two browsers, and XMPP will know which one is which.  This is basically the same approach Jabber for Windows uses.

 

* Fixed a problem where it detected a non-existent persistent chat room.

 

* If you delete a contact using some other method, such as EPASSoap, it detects the change and reloads the roster.  If that was the last contact in a group, the group disappears.

 

* Other minor bug fixes.

 

 

Previous post:

 

Noteworthy Changes

 

* Javascript is broken out into separate files for easier browsing.  For example, roster handling is in one file, multi-user chat rooms in another.

 

* This new demo will detect persistent chat rooms and add them to the roster.  CAXL does not allow you to create new persistent chat rooms, however.  You can only detect existing ones and use them.

 

* You can still create an ad-hoc multi-user chat room, and you can have multiple chat rooms open at once.

 

* The UI is back to using jQuery UI.  The material design Javascript library was too unstable to continue to use.

 


Known issues

 

* LDAP search for contact info is not yet working

 


To Do

 

* Add back the "save custom status" that was in the Material Design version

 

* Add back the desktop notifications that were in the Material Design version

 

* Clean up the code and add more comments explaining how things work

dstaudt

Jabber Web SDK v11.7 Released

Posted by dstaudt Aug 12, 2016
Cisco Unified Communications Voice and Video Version 11.7.0 for Web, System Release 11.7
Release date: August 4, 2016

SDK enhancements and significant changes in this release

  • BFCP Video Screen Share
  • Extend and Connect
  • Far End Camera Control (FECC)
  • Hunt Group Support
  • Call Pickup Support
  • CWIC API Changes
  • Releasing MSI installer for Windows

CWIC API Changes

In this release, the Jabber SDK JavaScript API has been completely overhauled, bringing big improvement in ease-of-use.  The new API is no longer implemented as a jQuery plugin, removing the dependency for jQuery for the SDK. All new and previous features are available through new API. Please refer to Jabber SDK 11.7.0 API documentation that has fully documented Classes and Objects that are introduced in this release as well as rich tutorials on how to use new and old features.


Backward Compatibility

The previous API (11.0.0) is considered deprecated, but is still present and will continue to work with existing applications.  New 11.7 features can still be used by incorporating the 11.7.0 library into existing web applications. This will make  transition and implementation of new features into an existing web applications easier.


Browser support note

As Microsoft announced, after January 12, 2016, only the most recent version of Internet Explorer available for a supported operating system will receive technical support and security updates. Jabber Web SDK releases after 11.0 will follow this support policy. Enterprise Mode for Internet Explorer 11, released in April 2014, offers enhanced backward compatibility and enables you to run many legacy Web apps during your transition to modern Web standards.

 


Download the Jabber SDK, Browser Add-On/Extension and Sample Code

To get the latest Jabber SDK components please visit:

     https://developer.cisco.com/site/jabber-websdk/overview/


Firefox Note

Firefox is following the industry trend of dropping support for NPAPI plugins. The Jabber SDK Add-On for Firefox is no longer whitelisted anymore so users must allow running plugin manually.


I have modified the sample.html (and accompanying sample.js) files in a way that may be helpful to those who want to learn more about Jabber SDK Voice/Video.  I added a log window to the page where you can see information about events that occur when you place calls, hold calls, mute audio, etc.

 

Simply download the attached files.  Place sampleWithObserver.html in the same directory as sample.html.  Put sampleWithObserver.js in the js directory below that, the same place where you'll find sample.js.

 

There are changes to the HTML file to add the log window, but most of the changes appear in the Javascript file (see function updateConversationInfo shown below for where to look).  This doesn't log every possible bit of information you can get from the conversation object, but it can serve as an example of what you can do to watch what's happening "behind the scenes".  Add your own items to watch, depending on what you're trying to achieve.

 


function updateConversationInfo(conversation, callcontainer) {
     if (signingOut) {
          return;
     }

     $( "div.log" ).append( "Call State: " + conversation.callState + "<BR>" );
     $( "div.log" ).append( "Call Event: " + conversation.callEvent + "<BR>" );
     $( "div.log" ).append( "Local Participant DN: " + conversation.localParticipant.directoryNumber + "<BR>" );
     $( "div.log" ).append( "Participant DN: " + conversation.participant.directoryNumber + "<BR>" );
     $( "div.log" ).append( "Participant Number: " + conversation.participant.number + "<BR>" );
     $( "div.log" ).append( "Participant External Number: " + conversation.participant.externalNumber + "<BR>" );
     $( "div.log" ).append( "Participant[0] Translated Number: " + conversation.participants[0].translatedNumber + "<BR>" );
     $( "div.log" ).append( "<BR><HR><BR>" );

... more modifications ...



" );

The Jabber SDK v11.0(1) and browser add-on are now available!

 

Downloads for Jabber SDK are available on DevNet (Cisco DevNet: SDK Web SDK - Voice and Video - Downloads and Docs).


The Jabber Voice and Video SDK is a jQuery based JavaScript toolkit that exposes methods and events to enable softphone control from within browser application. The SDK uses a browser add-on that uses the same technology as all our Jabber clients to provide high quality voice and video, and is supported by the major Windows and Mac OSX browsers.


In addition to enhanced quality, security and accessibility improvements, notable capabilities in 11.0(1) include:

  • Added a new API for controlling the border of a self-view in an external video window
  • Added an enhancement to ease using using multiple jQuery versions within the app

 

Additional information about the Jabber SDK, including release notes and product documentation, is available via Cisco DevNet: SDK Web SDK - Jabber SDK.  Developer resources are available on DevNet via http://jabberdeveloper.com.

npetrele

The Two Faces of Jabber SDK

Posted by npetrele Dec 1, 2015

Jabber SDK for web-based applications can be confusing because there are actually two different Jabber SDK components.  You can use either of them individually, or use both of them together in order to combine their features.


  1. Jabber SDK (CAXL or Jabberwerx) is a Javascript library that provides instant messaging features and presence (the ability to see who is online, etc.)


  1. Jabber Voice/Video is a Javascript library combined with an add-on (plus Chrome extension) that provides Voice and Video calling features


==========================================

Downloads (these links are current as of December 1, 2015)

==========================================


You can download Jabber SDK (CAXL) here:


(Release version)

https://developer.cisco.com/fileMedia/download/d4d1811b-4ec5-49d2-89d1-88d618ca3691


(Debug version)

https://developer.cisco.com/fileMedia/download/fbaa4858-fd48-479d-b41c-b95c9ff130cb


==========================================


You can download Jabber Voice/Video (version 11) here:


https://developer.cisco.com/fileMedia/download/91e9c4e5-b55a-490f-a3f0-359d0385fab5


Download the Voice/Video addon here:


https://software.cisco.com/download/release.html?i=!y&mdfid=283882159&softwareid=283995793&release=11.0%280%29&os


Download the Google Chrome extension for Voice/Video here:


https://chrome.google.com/webstore/detail/cisco-web-communicator/ppbllmlcmhfnfflbkbinnhacecaankdh


Download the sample code here:


https://developer.cisco.com/fileMedia/download/fe4ecb4e-7b7b-4c30-95cf-ba4b0e1fa536


==========================================

 

IMPORTANT NOTE FOR JABBER VOICE/VIDEO:


Do NOT use the sample code that comes with the Jabber Voice/Video download.  Download the sample code separately from the link above.


The sample code that comes with the Voice/Video download is missing utility functions in ciscobase.js, so things like cwic.html will not work.  A request to fix this is in the works.  In the meantime, the utility functions are present in ciscobase.js within the separate sample code download. 




The Jabber Guest 10.6 virtual machine, Web client, and iOS mobile app/SDK are now available!  The corresponding Android 10.6 mobile SDK updates are planned to be released in a few weeks.

 

You can find the upgrade to the 10.6 virtual machine and Web clients on Cisco.com.  The iOS app is in the App Store (https://itunes.apple.com/us/app/guest-access-cisco-jabber/id834663605?mt=8), and the iOS SDK is available on DevNet (https://developer.cisco.com/site/jabber-guestsdk/guestsdk/).


Jabber Guest builds on Cisco's Unified Communications video system to make it truly simple for organizations' employees to have rich, business-quality video calls with their customers and business partners.  Along with Cisco-provided Web experiences for Windows and Mac, and mobile experiences for iOS and Android smartphones and tablets, Jabber Guest includes easy-to-integrate SDKs that allow organizations to provide custom Web, iOS and Android app experiences optimized for their public-facing workflows.


In addition to further enhanced quality, security and accessibility, notable capabilities in 10.6 include:

  • Support for screen sharing to Guest users from business users with BFCP-enabled endpoints, e.g. Jabber for Windows/Mac or DX80
  • Support for co-resident app deployment on Business Edition 6000 servers (up to 100 concurrent sessions)
  • G.722 codec support for high-quality wideband audio in calls to many Cisco IP Phone models
  • The ability to hide and reposition one’s self-view in the Jabber Guest Web interface

 

Additional information about Jabber Guest, including release notes and product documentation, is available via http://www.cisco.com/go/jabberguest.  Developer resources are available on DevNet via http://jabberdeveloper.com.

The Jabber SDK team is just about ready to provide early access to the next major release of the Jabber SDK, which will be numbered 11.0.  Release of 11.0 to the Early Adopter Program (EAP) is targeting late June, and the final release of 11.0 is targeting Q3 2015 (calendar).


This release is adding for voice and video the highly sought after capabilities of VPN-less firewall/NAT traversal and Single Sign-On (SSO) using SAML.  These capabilities are planned to be available on Windows and Mac.  Also included in this release are volume control and custom ring tones on Windows.

 

These capabilities are being enabled using the same underlying client framework used in the Jabber for Windows and Jabber for Mac clients, so deployment of the Jabber SDK 11.0 will fit well into broader Jabber client deployments.  For example, the same Expressway/VCS used for Mobile Remote Access with Jabber clients will support such use with the Jabber SDK 11.0 for voice and video.  Similarly, existing SSO deployments for Jabber will support use with the Jabber SDK 11.0.  Also note that this new architecture for the Jabber SDK voice and video will enable support of the same codecs as in Jabber for Windows and Jabber for Mac, along with URI dialing.

 

As a result of the architecture update to the Jabber SDK for voice and video, there will be a small number of API changes that developers will need to manage for their existing applications.  These API changes were published earlier this year as 9.3 MR2 was released, see the Release Notes for details.

 

Here are directions on how to join the EAP today:

 

Join the Cisco Customer Connection Program (CCP) first if you haven’t already, and then you will have access to the Private - CCP space where you can register for a Jabber trial.

 

Getting Started:

  1. Please go to the CCP public landing page: http://www.cisco.com/go/ccp
  2. If you are already a CCP member, login with your cisco.com (CCO) ID.
  3. If you are not currently a CCP member, follow the instructions to join the CCP and then return to step 1 above.
  4. Once you’ve logged in, click on the link “Go to the private member community”.
  5. Once you are in the Private – CCP space, click on the “Access & sign up for trials” button in the Early Adopters and Beta Trials section.
  6. Select the Jabber trial of interest, read the requirements, and register for the trial.

 

We encourage interested developers to plan evaluation and testing with the Jabber SDK 11.0 as soon as it becomes available in EAP.  And as always, feedback in the EAP community will be most appreciated.

UPDATE: Big changes, many not visible, though.

 

4/22/2015: Lots of bug fixes.  I added a "fixit" function so that I can now use the latest materialize.js and materialize.css.

 

This version has major changes, including but not limited to:

 

  1. Removed all jQuery-UI components except resizable and draggable, replace with materialize components
  2. Discarded the ugly icons on the contacts, replaced with dropdown menu
  3. Group chat now integrated into the chat window instead of having its own window (unfortunately, group chat still doesn't work with Cisco Webex Connect yet)
  4. If you get a message from someone who is not in your roster, that person is automatically added to the "Unassigned" group.
  5. Other less visible changes too numerous to mention

 

Desktop notifications will appear when you receive a message while the app is not active and in focus. You can set the duration of the notifications in the Settings dialog.


This code is not fully optimized or cleaned yet.  But it's perfectly usable even as is. I have been using it as my default Jabber client at work for a while now. 

 

If you try this, note that the log no longer appears by default. If you want to watch the log, use the corner menu and select Show Log.

 

Enjoy, and feel free to post feedback about what you'd like added/changed.  Thanks!

 

Some screen shots:

 

Main Header/Menu and Roster

 

jsdkdemo-1.png

 

Custom Status:


jsdkdemo-2.png

 

Settings:

 

jsdkdemo-3.png

Below, you will find (attached) a Jabber SDK demo that is close to a fully function Jabber client. Most recent update has LOTS of UI tweaks, and added notifications for incoming messages if this app is not in focus.  I'm moving gradually toward a material design-like interface, as I have spare time to work on it. I'm about halfway through the redesign.  I'll post it here once I have it working.  In the meantime, this is a working Jabber app as it is, just not material design.

 

As you peruse the code, you should notice at least two things:

 

1. The code does not contain a lot of javascript-ese, such as embedding one function into another and into another and so on.  One of my complaints about Javascript is that clever programmers often write code this way, and I find it difficult to trace out the paths of execution. So I tried to avoid that in order to make my code easier to understand.  Also, I'm not that clever.

 

2. There's very little HTML in the .html files.  Almost everything in the DOM is dynamically generated.  You may not share my preference for this, but I find it easier to read my own code when I do it this way.  Hopefully, you'll find it easier to read, too.

 

This app serves as an example of how to accomplish the following things with CAXL:

 

1. Login session survives browser refresh

2. Chat sessions survive browser refresh (discarded when window is closed)

3. A log window shows you everything that's going on, including bound events

4. Roster shows presence (show and status) for contacts (behavior mostly imitates Jabber for Windows)

5. Set your own presence (synchronizes with Jabber/Windows)

6. Set custom status

7. Icons for each contact to edit, move to group, copy to group, remove from group, invite to multi-user chat

8. Add contacts (plus button), add new group with new contact

9. Multi-user chat rooms with CIMP server

10. Shows current chat status (composing, etc.) in chat window

11. Makes use of chatSession and numerous events

12. Links in chats are "linkified" (clidk on them to open a new tab with the link)

13. Chats are emojified (emoticons replace text emotions, etc.)

14. No more chat bubbles.. boohoo (OK, that's wasn't a feature of CAXL, anyway, but it was a a cool example of CSS)

 

I expect to make significant changes to the code, but I hope you find what's here useful in your CAXL adventures.  I will update this when new versions are available.

 

Known issues:

 

1. There are no quick contacts (yet)

2. Sometimes (very rarely for me) the client spontaneously disconnects. When this happens, the client should automatically reconnect, and it doesn't always do that properly. A page refresh should fix everything, but I'll continue to track down where it's failing to reconnect on its own.

3. Chat rooms don't work when using Webex Connect as the IM&P server.

4. If you open too many chats at once, the tabs will wrap, and that messes up the chat window formatting

 

Changelog 2-9-2015:

 

1. Changes reflected in features list above

2. Removed context menus, replaced with icons

3. Added "add contact" plus button, add contact works

 

Changelog 2-11-2015:


1. Customized UI theme to look less dated

2. If move or remove contact leaves a group empty, that group disappears from the roster

3. Reduced log spam (too many log messages)

4. Add Contact no longer reports an error if the contact already exists. It simply copies the contact into the group you specified, or updates the existing contact.

5. If a contact is in limbo (in the roster entity cache but doesn't show up in the visible roster), it is dumped into a group called "Unassigned".

 

Changelog 2-13-2015:

 

1. Changed individual chat windows to tabs that appear in one window

2. Replaced chat bubbles with plain text (different background for your texts vs. contact texts).  The bubbles just didn't go well with the new theme and tabbed chats.

 

Changelog 2-16-2015:

 

1. Added comments - not heavily commented, but better than before

 

Changelog 2-19-2015:

 

1. Moved tabbed chats into a dialog so you can resize it and move it around.

2. Added support for group chat (it's the signal icon next to the + add contact icon).  It's still primitive and quirky.

3. Added an "invite user" (to a multi-user chat window) icon to contacts. It's the one with the contact id card.

...I need to replace these icons with icons that really represent the actions.

4. Added support for emojis (like :cow:) and emoticons (like )

5. A number of CSS changes and minor UI tweaks

6. Replaced default javascript alert with alert dialog and error sound

 

Changelog 2-24-2015:

 

1. Tweaks to UI (flattened dialogs and elements, flat status icons, icons in chat status)

2. Streamlined emoticons and emoji handling, now uses only one open source javascript file (and its css and images)

3. Chat saves only the messages with the enclosing DIV that separates your texts from the other person's texts. This way, you (or I) can drop in an entirely different linkify or emojify function.  It applies these modifications after it fetches the raw chat html and before it displays the chat html, so it will display existing chats with the new linkify/emojify if changed. I doubt if I'll change these functions anymore, but the ability is there.

4. Exploring ways to fetch user's info (VCARD or whatever) via IQ stanzas.  Not working at all yet, but you'll see the code there.

 

Changelog 2-25-2015:

 

1. Fixed (I hope) a presence synchronization problem that appeared as oscillating between states (you could select "Available" and stop the oscillation)

2. Chat rooms now working problem-free (as far as I can tell, anyway) with CIMP servers. Still doesn't work with webex connect.

 

Changelog 2-27-2015:

 

1. The fix to presence oscillation didn't work.  This update should fix it, though.

 

Changelog 3-5-2015:

 

1. Lots of UI tweaks.  Some bug fixes.  Some streamlining of code.

 

Changelog 3-9-2015:

 

1. More UI tweaks (looks much better, if I do say so myself)

2. Pop-up notifications will appear for incoming messages if this demo isn't your active/focused application.

 

HOWTO:

 

Edit the jQchat.html file and you'll see the following (example below).  It is currently set up to default to a IMP server, but you need to edit the BOSH URL (httpBindingURL) to fit your server.  There's an example for a Cisco Webex account, too, if you have one.

 

Modify the demoConfig to fit your scenario and then load jQchat.html into your browser (tested with Chrome).  You don't need to enter your username/password in the configuration settings.  You don't actually need to edit any of these settings, since you can type them in at the login window, but I find it more convenient to edit them, which pre-loads the values into the login window.

 

Be sure to let us know if you have problems, questions, etc.  Remember, this is only a demo to help you learn CAXL.

 

IMPORTANT: 

 

1. If you're using Chrome and your connection is secure, navigate to your httpBindingURL before you try to log in.  You'll have to go through the process of bypassing the Chrome warning and accepting the certificate.  This lasts only until you close Chrome, then you'll have to do it again.  Or use Firefox and store the certificate to make it accept the cert permanently.

 

2. Make sure the unsecureAllowed and http/https matches the settings on your server.

 

Sample config (edit jqchat.html to edit these parameters):

 

var demoConfig = {

httpBindingURL: "https://your-imp-cups-server:7335/httpbinding",

username: "username",

password: "password",

unsecureAllowed: false,

domain: "cisco.com",
resource: "jqchat",
appTag: "app-data-8",
priority: 15
};

 

/*
* Webexconnect:
httpBindingURL: "https://im3.ciscowebex.com/http-bind",
username: "username",
password: "password",
unsecureAllowed: true,
*/

 

/*
* IMP
httpBindingURL: "https://your-imp-cups-server:7335/httpbinding",
username: "username",
password: "password",
unsecureAllowed: false,
*/

Jabber Guest for iOS SDK 10.5.3 Adds New Features and Enhancements

 

Developers and customers can now upgrade their Jabber Guest for iOS SDK to take advantage of HD video transmission, custom view changes, and iOS 8 support.

 

The Jabber Guest for iOS SDK now supports HD video transmission for compatible iOS devices which include the iPhone 5S, iPhone 6, iPhone 6 Plus, iPad Air, iPad Air 2, iPad Mini 2nd Generation, and iPad Mini 3rd Generation.

 

The CJGuestCallBarView and KeyPadView have been updated with a cleaner look and feel to match the UI in the Jabber Guest application posted in the App Store.

 

A new Live Support sample application has been added. It demonstrates how to allow users to contact live support while they continue to use their own app.

 

Applications using the Jabber Guest for iOS SDK can run on iOS 8. (Please note that Xcode 6 support and 64 bit support will be coming in the next release.)

 

A defect was fixed in this version of the SDK, to allow a Jabber Guest call on a device running iOS 8 to resume audio and video upon resuming from background mode.

 

In this version of the SDK the MPVolumeView no longer controls the volume, due to a known bug under iOS 7 and later, in the way MPVolumeControl interacts with AVAudioSessionModeVoiceChat. This will be corrected in the next release of the SDK.

Contents:

  • Chrome Removes Support for the NPAPI Plugin Interface
  • Jabber Guest introduces Chrome Extension/Add-On
  • Windows and Mac 64-bit Chrome Support
  • Mac OS X 10.10, and iOS 8 Support
  • Refreshed iOS User Experience
  • HD Video for Capable iOS Devices
  • Supports Calls to UCM-VCS VCS Endpoints

Developers and customers can now update their Jabber Guest installations to support the latest Google Chrome browser versions, as well as take advantage of updated Jabber Guest features.

 

Google Chrome NPAPI Deprecation

Following Google's lead in making the browser safer, faster and more reliable,  Jabber Guest is deprecating the aging NPAPI browser plugin architecture for Chrome. Jabber Guest 10.5 now supports its capabilities via a Chrome Extension plus a browser add-on. This architecture streamlines and safeguards the browser by using a sandboxed Chrome Extension plugin, while still providing best-in-class voice and video performance using a browser add-on, i.e. a Native Host application, for high performance HD media rendering and network resiliency.


This does mean that Chrome users will need to add the Jabber Guest Extension from the Chrome Web Store (no OS admin permission or browser restart required), in addition to running the the Jabber Guest installer.


Google Chrome 64-bit Support

Taking advantage of increased speed, stability and security, Jabber Guest 10.5 now supports the newly introduced 64-bit Chrome for Windows and Mac OS X.Note, these versions of Chrome do not support 32-bit plugins, such as the Jabber Guest 10.0 and earlier version plugins.

 

To ensure users can continue to use  Jabber Guest without issues following these Chrome updates, developers and customers should start testing their applications with Jabber Guest 10.5 today.

 

HD Video for Capable iOS Devices

HD video transmit from supported iOS devices is now available.  Devices include: iPhone 5s, 6, 6 Plus / iPad Air, Air 2, Mini 2, Mini 3

Supports Calls to UCM-VCS VCS Endpoints


Jabber Guest clients can now make calls to VCS-registered endpoints where CUCM is in the call signaling path.  Note: this does not support calls to VCS-registered endpoints when CUCM is not in the call path.


See the resources below for more information.

Cisco Jabber Guest Developer Center

Cisco Jabber Developer Community Forum

Contents:

  • Chrome Removes Support for the NPAPI Plugin Interface
  • Jabber SDK introduces Chrome Extension/Native Host
  • Windows and Mac 64-bit Chrome Support
  • Mac OS X 10.9.5 and 10.10 Application Signature Update
  • New Native Video Rendering Window
  • Updated CWIC API


Developers and customers can now update their voice & video integrated apps to Jabber SDK version 9.3, to support the latest Google Chrome browser versions, as well as take advantage of updated Jabber SDK features.

Google Chrome NPAPI Deprecation

Following Google's lead in making the browser safer, faster and more reliable, the Jabber SDK is deprecating the aging NPAPI browser plugin architecture for Chrome. Jabber SDK 9.3 now supports its capabilities via a Chrome Extension plus Native Host app. This architecture streamlines and safeguards the browser by using a sandboxed Chrome Extension plugin, while still providing best-in-class voice and video performance using a Native Host application for high performance HD media rendering and network prioritization.


This does mean that Chrome users will need to add the Cisco Web Communicator Chrome Extension from the Chrome Web Store (no OS admin permission or browser restart required), in addition to running the the Jabber Web Communicator installer.


Google Chrome 64-bit Support

Taking advantage of increased speed, stability and security, Jabber SDK 9.3 now supports the newly introduced 64-bit Chrome for Windows. Note, this version of Chrome does not support 32-bit plugins, such as the Jabber SDK 9.2 and earlier version plugins.

 

Google is planning to also release the 64-bit version of Chrome for Mac later this year, though unlike for Windows, 32-bit Chrome on Mac will not continue to be supported.

 

To ensure users can continue to use the Jabber SDK without issues following these Chrome updates, developers and customers should start testing their applications with Jabber SDK 9.3 today.


Mac OS X 10.9.5 and 10.10 Application Signature Update

As required by recent OS X code signing changes, version 3.1.0 of the Cisco Web Communicator Add-on for Mac now has a version 2 signature, and will be recognized by Gatekeeper on updated versions of OS X.


New Native Video Window

The new native video window capability in Jabber SDK 9.3 displays an external floating video window with integrated audio and video mute buttons and self-view option. This video window appears outside the browser, and can be moved around by the user. The existing in-browser video window rendering option remains available in all browsers, except for Chrome.


See the resources below for more information.

Cisco Jabber SDK Developer Center

Cisco Jabber SDK Downloads

Cisco Jabber SDK Community Forum

Filter Blog

By date:
By tag: