| /******************************************************************************* |
| * Copyright (c) 2005, 2008 IBM Corporation 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: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.equinox.internal.security.auth; |
| |
| import java.net.URL; |
| import javax.security.auth.Subject; |
| import javax.security.auth.callback.CallbackHandler; |
| import javax.security.auth.login.LoginContext; |
| import javax.security.auth.login.LoginException; |
| import org.eclipse.equinox.internal.security.auth.events.SecurityEventsManager; |
| import org.eclipse.equinox.internal.security.auth.nls.SecAuthMessages; |
| import org.eclipse.equinox.security.auth.ILoginContextListener; |
| import org.eclipse.equinox.security.auth.ILoginContext; |
| |
| public class SecureContext implements ILoginContext { |
| |
| private String configName; |
| private LoginContext loginContext; |
| private CallbackHandler handler; |
| |
| private SecurityEventsManager eventsManager = new SecurityEventsManager(); |
| private boolean loggedIn = false; |
| |
| public SecureContext(String configugationName) { |
| this(configugationName, null, null); |
| } |
| |
| public SecureContext(String configugationName, URL configFile, CallbackHandler handler) { |
| configName = configugationName; |
| SecurePlatformInternal platform = SecurePlatformInternal.getInstance(); |
| if (configFile != null) |
| platform.addConfigURL(configFile); // this call MUST be done before start() |
| platform.start(); |
| this.handler = handler; |
| } |
| |
| public void login() throws LoginException { |
| LoginContext context = getLoginContext(); |
| LoginException loginException = null; |
| eventsManager.notifyLoginBegin(context.getSubject()); |
| try { |
| context.login(); |
| } catch (LoginException e) { |
| loginException = e; |
| } |
| // subject might have changed if login() was triggered |
| eventsManager.notifyLoginEnd(context.getSubject(), loginException); |
| if (loginException != null) { |
| LoginException rtvException = new LoginException(SecAuthMessages.loginFailure); |
| rtvException.initCause(loginException); |
| throw rtvException; |
| } |
| loggedIn = true; |
| } |
| |
| public void logout() throws LoginException { |
| LoginContext context = getLoginContext(); |
| Subject subject = getLoginContext().getSubject(); |
| eventsManager.notifyLogoutBegin(subject); |
| |
| LoginException loginException = null; |
| try { |
| context.logout(); |
| } catch (LoginException e) { |
| loginException = e; |
| } |
| eventsManager.notifyLogoutEnd(subject, loginException); |
| loggedIn = false; |
| } |
| |
| public Subject getSubject() throws LoginException { |
| if (!loggedIn) |
| login(); |
| return getLoginContext().getSubject(); |
| } |
| |
| public LoginContext getLoginContext() throws LoginException { |
| if (loginContext != null) |
| return loginContext; |
| |
| CallbackHandler callbackHandler; |
| if (handler == null) |
| callbackHandler = SecurePlatformInternal.getInstance().loadCallbackHandler(configName); |
| else |
| callbackHandler = handler; |
| |
| if (callbackHandler == null) |
| loginContext = new LoginContext(configName); |
| else |
| loginContext = new LoginContext(configName, callbackHandler); |
| return loginContext; |
| } |
| |
| public void registerListener(ILoginContextListener listener) { |
| eventsManager.addListener(listener); |
| } |
| |
| public void unregisterListener(ILoginContextListener listener) { |
| eventsManager.removeListener(listener); |
| } |
| |
| } |