XMPPCallbackHandler.java 3.66 KB
Newer Older
1
/**
Matt Tucker's avatar
Matt Tucker committed
2 3
 * $Revision$
 * $Date$
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
 *
 * Copyright (C) 2005 Jive Software. All rights reserved.
 *
 * This software is published under the terms of the GNU Public License (GPL),
 * a copy of which is included in this distribution.
 */

package org.jivesoftware.wildfire.net;

import org.jivesoftware.wildfire.auth.AuthFactory;
import org.jivesoftware.wildfire.user.UserNotFoundException;

import javax.security.auth.callback.*;
import javax.security.sasl.AuthorizeCallback;
import javax.security.sasl.RealmCallback;
import java.io.IOException;

/**
Matt Tucker's avatar
Matt Tucker committed
22 23 24
 * Callback handler that may be used when doing SASL authentication. A CallbackHandler
 * may be required depending on the SASL mechanism being used. Currently DIGEST-MD5 and
 * CRAM-MD5 are the only mechanisms that will require a callback handler.<p>
25
 *
Matt Tucker's avatar
Matt Tucker committed
26 27 28 29 30
 * Mechanisms that use a digest don't include a password so the server needs to use the
 * stored password of the user to compare it (somehow) with the specified digest. This
 * operation requires that the UserProvider being used supports passwords retrival.
 * {@link SASLAuthentication} should not offer these kind of SASL mechanisms if the user
 * provider being in use does not support passwords retrieval.
31 32 33 34 35
 *
 * @author Hao Chen
 */
public class XMPPCallbackHandler implements CallbackHandler {

Matt Tucker's avatar
Matt Tucker committed
36 37
    public XMPPCallbackHandler() {
    }
38

Matt Tucker's avatar
Matt Tucker committed
39 40
    public void handle(final Callback[] callbacks)
            throws IOException, UnsupportedCallbackException {
41

Matt Tucker's avatar
Matt Tucker committed
42 43
        String realm = null;
        String name = null;
44

Matt Tucker's avatar
Matt Tucker committed
45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
        for (int i = 0; i < callbacks.length; i++) {
            // Log.info("Callback: " + callbacks[i].getClass().getSimpleName());
            if (callbacks[i] instanceof RealmCallback) {
                realm = ((RealmCallback) callbacks[i]).getText();
                if (realm == null) {
                    realm = ((RealmCallback) callbacks[i]).getDefaultText();
                }
                //Log.info("RealmCallback: " + realm);
            }
            else if (callbacks[i] instanceof NameCallback) {
                name = ((NameCallback) callbacks[i]).getName();
                if (name == null) {
                    name = ((NameCallback) callbacks[i]).getDefaultName();
                }
                //Log.info("NameCallback: " + name);
            }
            else if (callbacks[i] instanceof PasswordCallback) {
                try {
63 64 65 66 67 68
                    // Get the password from the UserProvider. Some UserProviders may not support
                    // this operation
                    ((PasswordCallback) callbacks[i])
                            .setPassword(AuthFactory.getPassword(name).toCharArray());

                    //Log.info("PasswordCallback: "
Matt Tucker's avatar
Matt Tucker committed
69 70 71 72 73 74 75 76 77 78
                    //+ new String(((PasswordCallback) callbacks[i]).getPassword()));
                }
                catch (UserNotFoundException e) {
                    throw new IOException(e.toString());
                }
            }
            else if (callbacks[i] instanceof AuthorizeCallback) {
                AuthorizeCallback authCallback = ((AuthorizeCallback) callbacks[i]);
                String authenId = authCallback.getAuthenticationID();
                String authorId = authCallback.getAuthorizationID();
79
                if (authenId.equals(authorId)) {
Matt Tucker's avatar
Matt Tucker committed
80 81 82 83 84 85 86 87 88 89 90
                    authCallback.setAuthorized(true);
                    authCallback.setAuthorizedID(authorId);
                }
                //Log.info("AuthorizeCallback: authorId: " + authorId);
            }
            else {
                throw new UnsupportedCallbackException(callbacks[i], "Unrecognized Callback");
            }
        }
    }
}