/* * The Alluxio Open Foundation licenses this work under the Apache License, version 2.0 * (the "License"). You may not use this work except in compliance with the License, which is * available at www.apache.org/licenses/LICENSE-2.0 * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied, as more fully set forth in the License. * * See the NOTICE file distributed with this work for information regarding copyright ownership. */ package alluxio.security.authentication; import org.junit.Assert; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import java.io.IOException; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; import javax.security.auth.callback.NameCallback; import javax.security.auth.callback.PasswordCallback; import javax.security.auth.callback.UnsupportedCallbackException; import javax.security.sasl.RealmCallback; /** * Tests the {@link PlainSaslClientCallbackHandler} * class. */ public final class PlainSaslClientCallbackHandlerTest { /** * The exception expected to be thrown. */ @Rule public ExpectedException mThrown = ExpectedException.none(); /** * Tests that the callback is handled correctly. */ @Test public void clientCallbackHandler() throws Exception { Callback[] callbacks = new Callback[2]; callbacks[0] = new NameCallback("Username:"); callbacks[1] = new PasswordCallback("Password:", true); String user = "alluxio-user-1"; String password = "alluxio-user-1-password"; CallbackHandler clientCBHandler = new PlainSaslClientCallbackHandler(user, password); clientCBHandler.handle(callbacks); validateCallbacks(user, password, callbacks); } /** * Tests that an exception is thrown in case an unsupported callback is used. */ @Test public void unsupportCallback() throws Exception { mThrown.expect(UnsupportedCallbackException.class); mThrown.expectMessage(RealmCallback.class + " is unsupported."); Callback[] callbacks = new Callback[3]; callbacks[0] = new NameCallback("Username:"); callbacks[1] = new PasswordCallback("Password:", true); callbacks[2] = new RealmCallback("Realm:"); String user = "alluxio-user-2"; String password = "alluxio-user-2-password"; CallbackHandler clientCBHandler = new PlainSaslClientCallbackHandler(user, password); clientCBHandler.handle(callbacks); } /** * Tests that the callback can handle a non-existent user. */ @Test public void nullNameCallback() throws Exception { Callback[] callbacks = new Callback[2]; callbacks[0] = new NameCallback("Username:"); callbacks[1] = new PasswordCallback("Password:", true); String user = null; String password = "alluxio-user-3-password"; CallbackHandler clientCBHandler = new PlainSaslClientCallbackHandler(user, password); clientCBHandler.handle(callbacks); validateCallbacks(user, password, callbacks); } /** * Tests that the callback can handle a non-existent password. */ @Test public void nullPasswordCallback() throws Exception { Callback[] callbacks = new Callback[2]; callbacks[0] = new NameCallback("Username:"); callbacks[1] = new PasswordCallback("Password:", true); String user = "alluxio-user-4"; String password = null; CallbackHandler clientCBHandler = new PlainSaslClientCallbackHandler(user, password); clientCBHandler.handle(callbacks); validateCallbacks(user, password, callbacks); } /** * Tests that an exception is thrown when a callback is {@code null}. */ @Test public void nullCallback() throws Exception { mThrown.expect(UnsupportedCallbackException.class); mThrown.expectMessage(null + " is unsupported."); Callback[] callbacks = new Callback[3]; callbacks[0] = new NameCallback("Username:"); callbacks[1] = new PasswordCallback("Password:", true); callbacks[2] = null; String user = "alluxio-user-5"; String password = "alluxio-user-5-password"; CallbackHandler clientCBHandler = new PlainSaslClientCallbackHandler(user, password); clientCBHandler.handle(callbacks); } private void validateCallbacks(String user, String passwd, Callback[] callbacks) throws IOException, UnsupportedCallbackException { for (Callback cb : callbacks) { if (cb instanceof NameCallback) { Assert.assertEquals(user, ((NameCallback) cb).getName()); } else if (cb instanceof PasswordCallback) { char[] passwordChar = ((PasswordCallback) cb).getPassword(); Assert.assertEquals(passwd, passwordChar == null ? null : String.copyValueOf(passwordChar)); } } } }