Salome HOME
Fix:
[tools/siman.git] / Workspace / Siman / src / org / splat / simer / ConnectionAction.java
1 package org.splat.simer;
2
3 import java.io.IOException;
4 import java.util.Map;
5 import java.util.Set;
6
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.AccountNotFoundException;
15 import javax.security.auth.login.FailedLoginException;
16 import javax.security.auth.login.LoginContext;
17
18 import org.splat.dal.bo.kernel.User;
19 import org.splat.som.ApplicationRights;
20 import org.splat.wapp.Constants;
21
22 /**
23  * User login action.
24  */
25 public class ConnectionAction extends Action {
26
27         /**
28          * User name.
29          */
30         private String _username = null;
31         /**
32          * User password.
33          */
34         private String _password = null;
35         private transient String _backmenu = null;
36
37         /**
38          * Serial version ID.
39          */
40         private static final long serialVersionUID = 6095471616361606231L;
41
42         /**
43          * Handler for login into SIMAN.
44          */
45         private class Handler implements CallbackHandler {
46                 /**
47                  * {@inheritDoc}
48                  * 
49                  * @see javax.security.auth.callback.CallbackHandler#handle(javax.security.auth.callback.Callback[])
50                  */
51                 @Override
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) {
59                                         // Get the username
60                                         NameCallback call = (NameCallback) callbacks[i];
61                                         call.setName(_username);
62
63                                 } else if (callbacks[i] instanceof PasswordCallback) {
64                                         // Get the password
65                                         if (_password != null) {
66                                                 PasswordCallback call = (PasswordCallback) callbacks[i];
67                                                 call.setPassword(_password.toCharArray());
68                                         }
69                                 } else {
70                                         throw new UnsupportedCallbackException(callbacks[i],
71                                                         "Unrecognized Callback");
72                                 }
73                         }
74                 }
75         }
76
77         // ==============================================================================================================================
78         // Action execution
79         // ==============================================================================================================================
80
81         /**
82          * Login the user with the given name and password into SIMAN.
83          * 
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
86          * 
87          * @see org.splat.kernel.RealmLoginModule
88          */
89         @SuppressWarnings("unchecked")
90         public String doLogin() {
91                 String res = INPUT;
92                 if (_username != null && _username.length() > 0) {
93                         if (_password != null && _password.length() == 0) {
94                                 _password = null; // User having no password
95                         }
96                         try {
97                                 LoginContext context = new LoginContext("Siman", new Handler());
98                                 context.login();
99
100                                 Subject identity = context.getSubject();
101                                 Set<User> table = identity.getPrincipals(User.class);
102                                 if (table.isEmpty()) {
103                                         throw new AccountNotFoundException();
104                                 }
105
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                                         session.remove(AbstractSearchBaseAction.RESULT_KEY); // The current result is obsolete
112                                         // Map<String,Object> kfilter = (Map<String, Object>)session.get("knowledge.filter");
113                                         Map<String, Object> sfilter = (Map<String, Object>) session
114                                                         .get("study.filter");
115
116                                         if (sfilter != null) {
117                                                 sfilter.put("state", "ANY");
118                                                 sfilter.put("visibility", "PRIVATE");
119                                                 if (logged.canCreateStudy()) {
120                                                         sfilter.put("author", String.valueOf(user
121                                                                         .getIndex()));
122                                                 }
123                                         }
124                                 }
125                                 this.connect(context, user); // Updates the session context
126
127                                 initializationScreenContext(Constants.NONE);
128
129                                 res = _backmenu;
130                                 if (res == null || "null".equals(res) || res.isEmpty()
131                                                 || Constants.NONE.equals(res)) {
132                                         res = Constants.OPEN;
133                                 }
134                         } catch (FailedLoginException error) {
135                                 setErrorCode("message.error.login." + error.getMessage());
136                                 res = INPUT;
137                         } catch (Exception error) {
138                                 LOG.error("Reason:", error);
139                                 res = ERROR;
140                         }
141                 }
142                 return res;
143         }
144
145         /**
146          * Disconnect the current user from SIMAN application.
147          * 
148          * @return SUCCESS if disconnected, ERROR - if exception is caught
149          */
150         @SuppressWarnings("unchecked")
151         public String doLogout() {
152                 String res;
153                 try {
154                         Map<String, Object> session = getSession();
155                         // Map<String,Object> kfilter = (Map<String, Object>)session.get("knowledge.filter");
156                         session.remove(AbstractSearchBaseAction.RESULT_KEY); // The current result is obsolete
157                         Map<String, Object> sfilter = (Map<String, Object>) session
158                                         .get("study.filter");
159                         LoginContext context = (LoginContext) session.get("login.context");
160
161                         String connectedUsr = "";
162                         if (getConnectedUser() != null) {
163                                 connectedUsr = getConnectedUser().toString();
164                         }
165
166                         LOG.info("Deconnection of " + connectedUsr + ".");
167
168                         if (context != null) {
169                                 context.logout();
170                         }
171
172                         // TODO: ProjectSettings.deleteDownloadDirectory(user);
173                         if (sfilter != null) {
174                                 sfilter.put("state", "ANY");
175                                 sfilter.put("author", "0");
176                         }
177
178                         this.disconnect(); // Updates the session context
179
180                         closeStudy();
181                         initializationScreenContext(Constants.NONE);
182
183                         res = _backmenu;
184                         if (res == null || "null".equals(res) || res.isEmpty()
185                                         || Constants.NONE.equals(res)) {
186                                 res = Constants.OPEN;
187                         }
188                 } catch (Exception error) {
189                         LOG.error("Reason:", error);
190                         res = ERROR;
191                 }
192                 return res;
193         }
194
195         // ==============================================================================================================================
196         // Getters and setters
197         // ==============================================================================================================================
198
199         /**
200          * Get user name.
201          * 
202          * @return user name
203          */
204         public String getUsername() {
205                 return _username;
206         }
207
208         /**
209          * Get user password.
210          * 
211          * @return user password
212          */
213         public String getPassword() {
214                 return _password;
215         }
216
217         /**
218          * Set user name.
219          * 
220          * @param value
221          *            user name
222          */
223         public void setUsername(final String value) {
224                 this._username = value;
225         }
226
227         /**
228          * Set user password.
229          * 
230          * @param value
231          *            the password
232          */
233         public void setPassword(final String value) {
234                 this._password = value;
235         }
236
237         /**
238          * Set menu for the user.
239          * 
240          * @param menu
241          *            menu key string
242          */
243         public void setBackMenu(final String menu) {
244                 this._backmenu = menu;
245         }
246 }