001 /**
002 *
003 * Copyright 2005 The Apache Software Foundation
004 *
005 * Licensed under the Apache License, Version 2.0 (the "License");
006 * you may not use this file except in compliance with the License.
007 * You may obtain a copy of the License at
008 *
009 * http://www.apache.org/licenses/LICENSE-2.0
010 *
011 * Unless required by applicable law or agreed to in writing, software
012 * distributed under the License is distributed on an "AS IS" BASIS,
013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014 * See the License for the specific language governing permissions and
015 * limitations under the License.
016 */
017 package org.apache.geronimo.security.jaas.client;
018
019 import java.util.Map;
020 import javax.security.auth.Subject;
021 import javax.security.auth.callback.Callback;
022 import javax.security.auth.callback.CallbackHandler;
023 import javax.security.auth.login.LoginException;
024 import javax.security.auth.login.FailedLoginException;
025
026 import org.apache.geronimo.security.jaas.server.JaasSessionId;
027 import org.apache.geronimo.security.jaas.server.JaasLoginServiceMBean;
028 import org.apache.geronimo.security.jaas.LoginModuleControlFlag;
029
030
031 /**
032 * @version $Revision: 472291 $ $Date: 2006-11-07 13:51:35 -0800 (Tue, 07 Nov 2006) $
033 */
034 public class ServerLoginProxy extends LoginModuleProxy {
035 CallbackHandler handler;
036 Callback[] callbacks;
037 private final int lmIndex;
038 private final JaasLoginServiceMBean service;
039 private final JaasSessionId sessionHandle;
040
041 public ServerLoginProxy(LoginModuleControlFlag controlFlag, Subject subject, int lmIndex,
042 JaasLoginServiceMBean service, JaasSessionId sessionHandle)
043 {
044 super(controlFlag, subject);
045 this.lmIndex = lmIndex;
046 this.service = service;
047 this.sessionHandle = sessionHandle;
048 }
049
050 public void initialize(Subject subject, CallbackHandler handler, Map sharedState, Map options) {
051 this.handler = handler;
052 }
053
054 /**
055 * Perform a login on the server side.
056 * <p/>
057 * Here we get the Callbacks from the server side, pass them to the
058 * local handler so that they may be filled. We pass the resulting
059 * set of Callbacks back to the server.
060 *
061 * @return true if the authentication succeeded, or false if this
062 * <code>LoginModule</code> should be ignored.
063 * @throws javax.security.auth.login.LoginException
064 * if the authentication fails
065 */
066 public boolean login() throws LoginException {
067 try {
068 callbacks = service.getServerLoginCallbacks(sessionHandle, lmIndex);
069 if (handler != null) {
070 handler.handle(callbacks);
071 } else if (callbacks != null && callbacks.length > 0) {
072 System.err.println("No callback handler available for " + callbacks.length + " callbacks!");
073 }
074 return service.performLogin(sessionHandle, lmIndex, callbacks);
075 } catch (FailedLoginException e) {
076 throw e;
077 } catch (Exception e) {
078 LoginException le = new LoginException("Error filling callback list");
079 le.initCause(e);
080 throw le;
081 }
082 }
083
084 public boolean commit() throws LoginException {
085 return service.performCommit(sessionHandle, lmIndex);
086 }
087
088 public boolean abort() throws LoginException {
089 return service.performAbort(sessionHandle, lmIndex);
090 }
091
092 public boolean logout() throws LoginException {
093 return false; // taken care of with a single call to the server
094 }
095 }