X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.cms%2Fsrc%2Forg%2Fargeo%2Fcms%2Fauth%2FUserAdminLoginModule.java;h=3dfbc0ddb194e94bc879d44ba380c6a3f3f4e05a;hb=0243aa5633af84d8608ba912483dbaaaefac42f1;hp=3e44e65335bc9eb18e439b26e2722cbb4ea0241e;hpb=9dba7b01008499bdaf15c754190906d3200713fe;p=lgpl%2Fargeo-commons.git diff --git a/org.argeo.cms/src/org/argeo/cms/auth/UserAdminLoginModule.java b/org.argeo.cms/src/org/argeo/cms/auth/UserAdminLoginModule.java index 3e44e6533..3dfbc0ddb 100644 --- a/org.argeo.cms/src/org/argeo/cms/auth/UserAdminLoginModule.java +++ b/org.argeo.cms/src/org/argeo/cms/auth/UserAdminLoginModule.java @@ -1,90 +1,114 @@ package org.argeo.cms.auth; +import java.io.IOException; +import java.util.Locale; import java.util.Map; import javax.security.auth.Subject; import javax.security.auth.callback.Callback; import javax.security.auth.callback.CallbackHandler; +import javax.security.auth.callback.LanguageCallback; import javax.security.auth.callback.NameCallback; import javax.security.auth.callback.PasswordCallback; +import javax.security.auth.callback.UnsupportedCallbackException; import javax.security.auth.login.CredentialNotFoundException; +import javax.security.auth.login.FailedLoginException; import javax.security.auth.login.LoginException; import javax.security.auth.spi.LoginModule; -import org.argeo.ArgeoException; +import org.argeo.cms.CmsException; +import org.argeo.eclipse.ui.specific.UiContext; import org.osgi.framework.BundleContext; +import org.osgi.framework.FrameworkUtil; import org.osgi.service.useradmin.Authorization; import org.osgi.service.useradmin.User; import org.osgi.service.useradmin.UserAdmin; public class UserAdminLoginModule implements LoginModule, AuthConstants { - private Subject subject; - private Map sharedState; private CallbackHandler callbackHandler; + private Map sharedState = null; + private boolean isAnonymous = false; + private BundleContext bc; + @SuppressWarnings("unchecked") @Override - public void initialize(Subject subject, CallbackHandler callbackHandler, - Map sharedState, Map options) { + public void initialize(Subject subject, CallbackHandler callbackHandler, Map sharedState, + Map options) { try { - this.subject = subject; - this.sharedState = (Map) sharedState; + bc = FrameworkUtil.getBundle(UserAdminLoginModule.class).getBundleContext(); + assert bc != null; + // this.subject = subject; this.callbackHandler = callbackHandler; + this.sharedState = (Map) sharedState; if (options.containsKey("anonymous")) - isAnonymous = Boolean.parseBoolean(options.get("anonymous") - .toString()); + isAnonymous = Boolean.parseBoolean(options.get("anonymous").toString()); } catch (Exception e) { - throw new ArgeoException("Cannot initialize login module", e); + throw new CmsException("Cannot initialize login module", e); } } @Override public boolean login() throws LoginException { - BundleContext bc = (BundleContext) sharedState - .get(AuthConstants.BUNDLE_CONTEXT_KEY); - UserAdmin userAdmin = bc.getService(bc - .getServiceReference(UserAdmin.class)); - Authorization authorization = (Authorization) sharedState - .get(AuthConstants.AUTHORIZATION_KEY); - if (authorization == null) - if (!isAnonymous) { - // ask for username and password - NameCallback nameCallback = new NameCallback("User"); - PasswordCallback passwordCallback = new PasswordCallback( - "Password", false); - - // handle callbacks - try { - callbackHandler.handle(new Callback[] { nameCallback, - passwordCallback }); - } catch (Exception e) { - throw new ArgeoException("Cannot handle callbacks", e); - } + UserAdmin userAdmin = bc.getService(bc.getServiceReference(UserAdmin.class)); + Authorization authorization = null; + if (isAnonymous) { + authorization = userAdmin.getAuthorization(null); + } else { + // ask for username and password + NameCallback nameCallback = new NameCallback("User"); + PasswordCallback passwordCallback = new PasswordCallback("Password", false); + LanguageCallback langCallback = new LanguageCallback(); + try { + callbackHandler.handle(new Callback[] { nameCallback, passwordCallback, langCallback }); + } catch (IOException e) { + throw new LoginException("Cannot handle callback: " + e.getMessage()); +// } catch (ThreadDeath e) { +// throw new ThreadDeathLoginException("Callbackhandler thread died", e); + } catch (UnsupportedCallbackException e) { + return false; + } + + // i18n + Locale locale = langCallback.getLocale(); + if (locale == null) + locale = Locale.getDefault(); + UiContext.setLocale(locale); + + authorization = (Authorization) sharedState.get(SHARED_STATE_AUTHORIZATION); + if (authorization == null) { // create credentials final String username = nameCallback.getName(); - if (username == null || username.trim().equals("")) - throw new CredentialNotFoundException( - "No credentials provided"); - - char[] password = {}; - if (passwordCallback.getPassword() != null) - password = passwordCallback.getPassword(); - else - throw new CredentialNotFoundException( - "No credentials provided"); - - User user = userAdmin.getUser(null, username); - if (user == null) - return false; - if (!user.hasCredential(null, password)) - return false; - authorization = userAdmin.getAuthorization(user); - } else { - authorization = userAdmin.getAuthorization(null); + if (username == null || username.trim().equals("")) { + // authorization = userAdmin.getAuthorization(null); + throw new CredentialNotFoundException("No credentials provided"); + } else { + char[] password = {}; + if (passwordCallback.getPassword() != null) + password = passwordCallback.getPassword(); + else + throw new CredentialNotFoundException("No credentials provided"); + + User user = userAdmin.getUser(null, username); + if (user == null) + throw new FailedLoginException("Invalid credentials"); + if (!user.hasCredential(null, password)) + throw new FailedLoginException("Invalid credentials"); + // return false; + + // Log and monitor new login + // if (log.isDebugEnabled()) + // log.debug("Logged in to CMS with username [" + username + + // "]"); + + authorization = userAdmin.getAuthorization(user); + } } - subject.getPrivateCredentials().add(authorization); + } + if (!sharedState.containsKey(SHARED_STATE_AUTHORIZATION)) + sharedState.put(SHARED_STATE_AUTHORIZATION, authorization); return true; } @@ -95,20 +119,11 @@ public class UserAdminLoginModule implements LoginModule, AuthConstants { @Override public boolean abort() throws LoginException { - cleanUp(); return true; } @Override public boolean logout() throws LoginException { - cleanUp(); return true; } - - private void cleanUp() { - subject.getPrivateCredentials().removeAll( - subject.getPrivateCredentials(Authorization.class)); - subject = null; - } - }