Sumit Bahadur
Sumit Bahadur

Reputation: 69

SASLErrorException: SASLError using DIGEST-MD5: not-authorized while using Smack 4.2

I am trying to make a simple chat application. I have been researching about this and found smack library. For this,i downlaoded all the libraries and installed the openfire server in my computer and created few users in it for testing. I could finally connect to the server but then I am getting log-in failures. I tried to login using the same username from the spark and it works fine. I am getting errors on SASL authentication. Need some help.

These are my imports:

import org.jivesoftware.smack.AbstractXMPPConnection;
import org.jivesoftware.smack.ConnectionConfiguration; 
import org.jivesoftware.smack.SmackException; 
import org.jivesoftware.smack.StanzaListener;
import org.jivesoftware.smack.XMPPException;
import org.jivesoftware.smack.filter.StanzaFilter;  
import org.jivesoftware.smack.filter.StanzaTypeFilter;
import org.jivesoftware.smack.packet.Message;
import org.jivesoftware.smack.packet.Presence;
import org.jivesoftware.smack.packet.Stanza;
import org.jivesoftware.smack.roster.Roster;
import org.jivesoftware.smack.roster.RosterEntry;
import org.jivesoftware.smack.tcp.XMPPTCPConnection;
import org.jivesoftware.smack.tcp.XMPPTCPConnectionConfiguration;
import org.jxmpp.jid.Jid;

These are my parameters:

public static final String HOST = "192.168.1.114";
public static final int PORT = 5222;
public static final String SERVICE = "192.168.1.114"; // i dont know if its right.. 
public static final String USERNAME = "test";
public static final String PASSWORD = "test";

This is the code:

 public void connect()
  {
    final ProgressDialog dialog = ProgressDialog.show(this, "Connecting...", "Please wait...", false);

    Thread t = new Thread(new Runnable() {
        @Override
        public void run() {
            // Create a connection
            //    ConnectionConfiguration connConfig = new ConnectionConfiguration(HOST, PORT, SERVICE);
            Log.v("checking", "011");

            XMPPTCPConnectionConfiguration.Builder connConfig = XMPPTCPConnectionConfiguration.builder();
            connConfig.setSecurityMode(ConnectionConfiguration.SecurityMode.disabled);  // enabled gives me SSL certificate authorization errors...
            connConfig.setUsernameAndPassword(USERNAME, PASSWORD);

            try {
                connConfig.setServiceName(JidCreate.domainBareFrom(SERVICE));
            } catch (XmppStringprepException e) {
                e.printStackTrace();
                Log.v("checking", e.toString() + "1");
            }
            connConfig.setHost(HOST);
            connConfig.setPort(PORT);
            connConfig.setDebuggerEnabled(true);


            AbstractXMPPConnection connection = new XMPPTCPConnection(connConfig.build());

            try {
                connection.connect();
                Log.v("XMPPChatDemoActivity",  "[SettingsDialog] Connected to "+connection.getHost());
            } catch (XMPPException ex) {
                Log.v("XMPPChatDemoActivity",  "[SettingsDialog] Failed to connect to "+ connection.getHost());            
                Log.v("XMPPChatDemoActivity", ex.toString());
                setConnection(null);
            } catch (SmackException e) {
                e.printStackTrace();
                Log.v("XMPPChatDemoActivity", e.toString());
            } catch (IOException e) {
                e.printStackTrace();
                Log.v("XMPPChatDemoActivity", e.toString());
            } catch (InterruptedException e) {
                e.printStackTrace();
                Log.v("XMPPChatDemoActivity", e.toString());
            }
            try {
                connection.login(USERNAME, PASSWORD);
                Log.v("XMPPChatDemoActivity", "Logged in as" + connection.getUser());

                // Set the status to available
                Presence presence = new Presence(Presence.Type.available);
                connection.sendStanza(presence);
                setConnection((XMPPTCPConnection) connection);

                Roster roster = Roster.getInstanceFor(connection);

                Collection<RosterEntry> entries = roster.getEntries();
                for (RosterEntry entry : entries) {

                    Log.v("XMPPChatDemoActivity",  "--------------------------------------");
                    Log.v("XMPPChatDemoActivity", "RosterEntry " + entry);
                    Log.v("XMPPChatDemoActivity", "User: " + entry.getUser());
                    Log.v("XMPPChatDemoActivity", "Name: " + entry.getName());
                    Log.v("XMPPChatDemoActivity", "Status: " + entry.getStatus());
                    Log.v("XMPPChatDemoActivity", "Type: " + entry.getType());
                    Presence entryPresence = roster.getPresence(entry.getUser());

                    Log.v("XMPPChatDemoActivity", "Presence Status: "+ entryPresence.getStatus());
                    Log.v("XMPPChatDemoActivity", "Presence Type: " + entryPresence.getType());

                    Presence.Type type = entryPresence.getType();
                    if (type == Presence.Type.available)
                        Log.d("XMPPChatDemoActivity", "Presence AVIALABLE");
                    Log.v("XMPPChatDemoActivity", "Presence : " + entryPresence);
                }
            } catch (XMPPException ex) {
                Log.v("XMPPChatDemoActivity", "Failed to log in as "+  USERNAME + " or " + connection.getHost());
                Log.v("XMPPChatDemoActivity", ex.toString());

                setConnection(null);
            } catch (SmackException.NotConnectedException e) {
                e.printStackTrace();
            } catch (SmackException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            dialog.dismiss();
        }
    });
    t.start();
    dialog.show();
}

This is a snippet from the logcat:

08-03 06:56:26.812    8824-8824/com.example.sumit.testapp V/ActivityThread﹕ updateVisibility : ActivityRecord{15e86073 token=android.os.BinderProxy@26aa149d {com.example.sumit.testapp/com.example.sumit.testapp.MainActivity}} show : true
08-03 06:56:26.902    8824-8874/com.example.sumit.testapp D/SMACK﹕ SENT (0): <stream:stream xmlns='jabber:client' to='192.168.1.114' xmlns:stream='http://etherx.jabber.org/streams' version='1.0' from='[email protected]' xml:lang='en'>
08-03 06:56:26.922    8824-8875/com.example.sumit.testapp D/SMACK﹕ RECV (0): <?xml version='1.0' encoding='UTF-8'?><stream:stream xmlns:stream="http://etherx.jabber.org/streams" xmlns="jabber:client" from="bahadurxxx" id="e61566be" xml:lang="en" version="1.0">
08-03 06:56:26.922    8824-8875/com.example.sumit.testapp D/SMACK﹕ RECV (0): <stream:features><starttls xmlns="urn:ietf:params:xml:ns:xmpp-tls"></starttls><mechanisms xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><mechanism>DIGEST-MD5</mechanism><mechanism>PLAIN</mechanism><mechanism>ANONYMOUS</mechanism><mechanism>CRAM-MD5</mechanism></mechanisms><compression xmlns="http://jabber.org/features/compress"><method>zlib</method></compression><auth xmlns="http://jabber.org/features/iq-auth"/><register xmlns="http://jabber.org/features/iq-register"/></stream:features>
08-03 06:56:26.932    8824-8863/com.example.sumit.testapp V/XMPPChatDemoActivity﹕ [SettingsDialog] Connected to 192.168.1.114
08-03 06:56:26.932    8824-8824/com.example.sumit.testapp I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@26aa149d time:22662680

08-03 06:56:26.932    8824-8874/com.example.sumit.testapp D/SMACK﹕ SENT (0): <auth xmlns='urn:ietf:params:xml:ns:xmpp-sasl' mechanism='DIGEST-MD5'>=</auth>
08-03 06:56:26.932    8824-8875/com.example.sumit.testapp D/SMACK﹕ RECV (0): <challenge xmlns="urn:ietf:params:xml:ns:xmpp-sasl">cmVhbG09ImJhaGFkdXJ4eHgiLG5vbmNlPSJIVEVaUU5kRWpJM0cxRUtoWHFVYVM4akhyZkpNdTMyaTFPYVBETkJyIixxb3A9ImF1dGgiLGNoYXJzZXQ9dXRmLTgsYWxnb3JpdGhtPW1kNS1zZXNz</challenge>
08-03 06:56:26.932    8824-8874/com.example.sumit.testapp D/SMACK﹕ SENT (0): <response xmlns='urn:ietf:params:xml:ns:xmpp-sasl'>dXNlcm5hbWU9InRlc3QiLHJlYWxtPSIxOTIuMTY4LjEuMTE0Iixub25jZT0iSFRFWlFOZEVqSTNHMUVLaFhxVWFTOGpIcmZKTXUzMmkxT2FQRE5CciIsY25vbmNlPSJVUDR5c3dpOVlMMDY3RTNvMTZrNTVwT1FKdDEzMWVSWSIsbmM9MDAwMDAwMDEscW9wPWF1dGgsZGlnZXN0LXVyaT0ieG1wcC8xOTIuMTY4LjEuMTE0IixyZXNwb25zZT04NzllZmVjZGJhMGUwMDc1N2FmZWYxZmQxOWVhYTI0MyxjaGFyc2V0PXV0Zi04</response>
08-03 06:56:26.942    8824-8875/com.example.sumit.testapp D/SMACK﹕ RECV (0): <failure xmlns="urn:ietf:params:xml:ns:xmpp-sasl"><not-authorized/></failure>
08-03 06:56:26.942    8824-8863/com.example.sumit.testapp V/XMPPChatDemoActivity﹕ Failed to log in as test or 192.168.1.114
08-03 06:56:26.942    8824-8863/com.example.sumit.testapp V/XMPPChatDemoActivity﹕ org.jivesoftware.smack.sasl.SASLErrorException: SASLError using DIGEST-MD5: not-authorized
08-03 06:56:30.582    8824-8824/com.example.sumit.testapp I/Timeline﹕ Timeline: Activity_idle id: android.os.BinderProxy@26aa149d time:22666335
08-03 06:56:30.622    8824-8824/com.example.sumit.testapp E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
08-03 06:56:30.622    8824-8824/com.example.sumit.testapp E/SpannableStringBuilder﹕ SPAN_EXCLUSIVE_EXCLUSIVE spans cannot have a zero length
08-03 06:59:27.082    8824-8875/com.example.sumit.testapp D/SMACK﹕ RECV (0): <iq type="get" id="553-31" from="bahadurxxx" to="bahadurxxx/e61566be"><ping xmlns="urn:xmpp:ping"/></iq>
08-03 06:59:27.092    8824-8874/com.example.sumit.testapp D/SMACK﹕ SENT (0): <iq to='bahadurxxx' id='553-31' type='result'></iq>

Upvotes: 0

Views: 3609

Answers (1)

xnyhps
xnyhps

Reputation: 3316

Your client is trying to authenticate with the realm "192.168.1.114", while the server only offers the realm "bahadurxxx". That's not going to work. You should either set SERVICE to "bahadurxxx" or change the server's hostname to "192.168.1.114".

Each XMPP address has a domain, like example.com in [email protected], just like with email. This is the domain you must authenticate with and the address you'll use for your own server over XMPP. However, the XMPP server does not necessarily need to run on example.com, it may be that the server is actually on xmpp.example.com. SRV records are one way to indicate that example.com lives on xmpp.example.com instead.

In Smack, .setServiceName() sets the XMPP domain that you want to use (no surprise that it has been renamed to .setXmppDomain()). .setHost() can be use as another way to indicate that you want to use xmpp.example.com.

Upvotes: 1

Related Questions