/******************************************************************************* * Copyright (c) 2007, 2014 compeople AG and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * compeople AG - initial API and implementation *******************************************************************************/ package org.eclipse.riena.security.common.authentication; import javax.security.auth.callback.Callback; import javax.security.auth.callback.ChoiceCallback; import javax.security.auth.callback.ConfirmationCallback; import javax.security.auth.callback.LanguageCallback; import javax.security.auth.callback.NameCallback; import javax.security.auth.callback.PasswordCallback; import javax.security.auth.callback.TextInputCallback; import javax.security.auth.callback.TextOutputCallback; import org.eclipse.riena.security.common.authentication.credentials.AbstractCredential; import org.eclipse.riena.security.common.authentication.credentials.ChoiceCredential; import org.eclipse.riena.security.common.authentication.credentials.ConfirmationCredential; import org.eclipse.riena.security.common.authentication.credentials.CustomCredential; import org.eclipse.riena.security.common.authentication.credentials.LanguageCredential; import org.eclipse.riena.security.common.authentication.credentials.NameCredential; import org.eclipse.riena.security.common.authentication.credentials.PasswordCredential; import org.eclipse.riena.security.common.authentication.credentials.TextInputCredential; import org.eclipse.riena.security.common.authentication.credentials.TextOutputCredential; /** * this class converts between JAAS callbacks and credential object so that they * can be easily transported to a remote service */ public final class Callback2CredentialConverter { private Callback2CredentialConverter() { // utility } /** * Convert Callback objects to AbstractCredential objects * * @param callbacks * @return */ public static AbstractCredential[] callbacks2Credentials(final Callback[] callbacks) { final AbstractCredential[] creds = new AbstractCredential[callbacks.length]; int i = 0; for (final Callback cb : callbacks) { if (cb instanceof NameCallback) { final NameCallback ncb = (NameCallback) cb; final NameCredential nc = new NameCredential(ncb.getPrompt(), ncb.getDefaultName()); nc.setName(ncb.getName()); creds[i++] = nc; } else if (cb instanceof PasswordCallback) { final PasswordCallback pcb = (PasswordCallback) cb; final PasswordCredential pc = new PasswordCredential(pcb.getPrompt(), pcb.isEchoOn()); pc.setPassword(pcb.getPassword()); creds[i++] = pc; } else if (cb instanceof ConfirmationCallback) { final ConfirmationCallback ccb = (ConfirmationCallback) cb; final ConfirmationCredential ccc = new ConfirmationCredential(ccb.getMessageType(), ccb.getOptionType(), ccb.getDefaultOption()); ccc.setSelectedIndex(ccb.getSelectedIndex()); creds[i++] = ccc; } else if (cb instanceof TextInputCallback) { final TextInputCallback ticb = (TextInputCallback) cb; final TextInputCredential tic = new TextInputCredential(ticb.getPrompt(), ticb.getDefaultText()); tic.setText(ticb.getText()); creds[i++] = tic; } else if (cb instanceof TextOutputCallback) { final TextOutputCallback tocb = (TextOutputCallback) cb; final TextOutputCredential toc = new TextOutputCredential(tocb.getMessageType(), tocb.getMessage()); creds[i++] = toc; } else if (cb instanceof LanguageCallback) { final LanguageCallback lcb = (LanguageCallback) cb; final LanguageCredential lc = new LanguageCredential(lcb.getLocale()); creds[i++] = lc; } else if (cb instanceof ChoiceCallback) { final ChoiceCallback ccb = (ChoiceCallback) cb; final ChoiceCredential cc = new ChoiceCredential(ccb.getPrompt(), ccb.getChoices(), ccb.getDefaultChoice(), ccb.allowMultipleSelections()); cc.setSelections(ccb.getSelectedIndexes()); creds[i++] = cc; } else { final CustomCredential cc = new CustomCredential(cb); creds[i++] = cc; } } return creds; } public static Callback[] credentials2Callbacks(final AbstractCredential[] credentials) { final Callback[] callbacks = new Callback[credentials.length]; int i = 0; for (final AbstractCredential cred : credentials) { if (cred instanceof NameCredential) { final NameCredential nc = (NameCredential) cred; NameCallback ncb; if (nc.getDefaultName() == null) { ncb = new NameCallback(nc.getPrompt()); } else { ncb = new NameCallback(nc.getPrompt(), nc.getDefaultName()); } ncb.setName(nc.getName()); callbacks[i++] = ncb; } else if (cred instanceof PasswordCredential) { final PasswordCredential pc = (PasswordCredential) cred; final PasswordCallback pcb = new PasswordCallback(pc.getPrompt(), pc.isEchoOn()); pcb.setPassword(pc.getPassword()); callbacks[i++] = pcb; } else if (cred instanceof ConfirmationCredential) { final ConfirmationCredential cc = (ConfirmationCredential) cred; final ConfirmationCallback ccb = new ConfirmationCallback(cc.getMessageType(), cc.getOptionType(), cc.getDefaultOption()); ccb.setSelectedIndex(cc.getSelectedIndex()); callbacks[i++] = ccb; } else if (cred instanceof TextInputCredential) { final TextInputCredential tic = (TextInputCredential) cred; final TextInputCallback ticb = new TextInputCallback(tic.getPrompt(), tic.getDefaultText()); ticb.setText(tic.getText()); callbacks[i++] = ticb; } else if (cred instanceof TextOutputCredential) { final TextOutputCredential toc = (TextOutputCredential) cred; final TextOutputCallback tocb = new TextOutputCallback(toc.getMessageType(), toc.getMessage()); callbacks[i++] = tocb; } else if (cred instanceof LanguageCredential) { final LanguageCredential lc = (LanguageCredential) cred; final LanguageCallback lcb = new LanguageCallback(); lcb.setLocale(lc.getLocale()); callbacks[i++] = lcb; } else if (cred instanceof ChoiceCredential) { final ChoiceCredential cc = (ChoiceCredential) cred; final ChoiceCallback ccb = new ChoiceCallback(cc.getPrompt(), cc.getChoices(), cc.getDefaultChoice(), cc.isMultipleSelectionsAllowed()); final int[] selections = cc.getSelections(); if (selections.length == 1) { ccb.setSelectedIndex(selections[0]); } else { ccb.setSelectedIndexes(cc.getSelections()); } callbacks[i++] = ccb; } else if (cred instanceof CustomCredential) { callbacks[i++] = ((CustomCredential) cred).getCallback(); } } return callbacks; } }