1 package org.splat.simer;
3 import java.io.IOException;
7 import javax.security.auth.Subject;
8 import javax.security.auth.callback.Callback;
9 import javax.security.auth.callback.CallbackHandler;
10 import javax.security.auth.callback.NameCallback;
11 import javax.security.auth.callback.PasswordCallback;
12 import javax.security.auth.callback.TextOutputCallback;
13 import javax.security.auth.callback.UnsupportedCallbackException;
14 import javax.security.auth.login.FailedLoginException;
15 import javax.security.auth.login.LoginContext;
17 import org.splat.dal.bo.kernel.User;
18 import org.splat.som.ApplicationRights;
23 public class ConnectionAction extends Action {
28 private String _username = null;
32 private String _password = null;
33 private transient String _backmenu = null;
35 private String _menuProperty;
40 private static final long serialVersionUID = 6095471616361606231L;
43 * Handler for login into SIMAN.
45 private class Handler implements CallbackHandler {
49 * @see javax.security.auth.callback.CallbackHandler#handle(javax.security.auth.callback.Callback[])
52 public void handle(final Callback[] callbacks) throws IOException,
53 UnsupportedCallbackException {
54 for (int i = 0; i < callbacks.length; i++) {
55 if (callbacks[i] instanceof TextOutputCallback) {
56 // Display a message according to a specified type
57 LOG.info(((TextOutputCallback) callbacks[i]).getMessage());
58 } else if (callbacks[i] instanceof NameCallback) {
60 NameCallback call = (NameCallback) callbacks[i];
61 call.setName(_username);
63 } else if (callbacks[i] instanceof PasswordCallback) {
65 if (_password != null) {
66 PasswordCallback call = (PasswordCallback) callbacks[i];
67 call.setPassword(_password.toCharArray());
70 throw new UnsupportedCallbackException(callbacks[i],
71 "Unrecognized Callback");
77 // ==============================================================================================================================
79 // ==============================================================================================================================
82 * Login the user with the given name and password into SIMAN.
84 * @return SUCCESS if succeeded, INPUT - if some mandatory parameter is absent or FailedLoginException is caught during login, ERROR -
85 * if other exception is caught
87 * @see org.splat.kernel.RealmLoginModule
89 @SuppressWarnings("unchecked")
90 public String doLogin() {
92 if (_username != null && _username.length() > 0) {
93 if (_password != null && _password.length() == 0) {
94 _password = null; // User having no password
97 LoginContext context = new LoginContext("Siman", new Handler());
100 Subject identity = context.getSubject();
101 Set<User> table = identity.getPrincipals(User.class);
102 if (table.isEmpty()) {
103 throw new Exception();
106 User user = table.iterator().next(); // The user is (apparently...) the 1st principal
107 ApplicationRights logged = new ApplicationRights(user);
108 if (logged.canContributeToStudy() || logged.canValidate()) {
109 // TODO: Set the search filter according to user preferences
110 Map<String, Object> session = getSession();
111 // Map<String,Object> kfilter = (Map<String, Object>)session.get("knowledge.filter");
112 Map<String, Object> sfilter = (Map<String, Object>) session
113 .get("study.filter");
115 sfilter.put("state", "ANY");
116 sfilter.put("visibility", "PRIVATE");
117 if (logged.canCreateStudy()) {
118 sfilter.put("author", String.valueOf(user.getIndex()));
121 this.connect(context, user); // Updates the session context
123 setMenuProperty("none");
124 initializationScreenContext(_menuProperty);
127 } catch (FailedLoginException error) {
128 setErrorCode("message.error.login." + error.getMessage());
130 } catch (Exception error) {
131 LOG.error("Reason:", error);
139 * Disconnect the current user from SIMAN application.
141 * @return SUCCESS if disconnected, ERROR - if exception is caught
143 @SuppressWarnings("unchecked")
144 public String doLogout() {
147 Map<String, Object> session = getSession();
148 // Map<String,Object> kfilter = (Map<String, Object>)session.get("knowledge.filter");
149 Map<String, Object> sfilter = (Map<String, Object>) session
150 .get("study.filter");
151 LoginContext context = (LoginContext) session.get("login.context");
153 String connectedUsr = "";
154 if (getConnectedUser() != null) {
155 connectedUsr = getConnectedUser().toString();
158 LOG.info("Deconnection of " + connectedUsr + ".");
160 if (context != null) {
164 // TODO: ProjectSettings.deleteDownloadDirectory(user);
165 if (sfilter != null) {
166 sfilter.put("state", "ANY");
167 sfilter.put("author", "0");
170 this.disconnect(); // Updates the session context
172 setMenuProperty("none");
173 initializationScreenContext(_menuProperty);
176 } catch (Exception error) {
177 LOG.error("Reason:", error);
183 // ==============================================================================================================================
184 // Getters and setters
185 // ==============================================================================================================================
192 public String getUsername() {
199 * @return user password
201 public String getPassword() {
211 public void setUsername(final String value) {
212 this._username = value;
221 public void setPassword(final String value) {
222 this._password = value;
226 * Set menu for the user.
231 public void setBackMenu(final String menu) {
232 this._backmenu = menu;
236 * Get the menuProperty.
238 * @return the menuProperty
240 public String getMenuProperty() {
241 return _menuProperty;
245 * Set the menuProperty.
247 * @param menuProperty
248 * the menuProperty to set
250 public void setMenuProperty(final String menuProperty) {
251 this._menuProperty = menuProperty;