Salome HOME
f2706f45bc70916522dfae72e49264dc24201378
[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                                         // Map<String,Object> kfilter = (Map<String, Object>)session.get("knowledge.filter");
112                                         Map<String, Object> sfilter = (Map<String, Object>) session
113                                                         .get("study.filter");
114
115                                         if (sfilter != null) {
116                                                 sfilter.put("state", "ANY");
117                                                 sfilter.put("visibility", "PRIVATE");
118                                                 if (logged.canCreateStudy()) {
119                                                         sfilter.put("author", String.valueOf(user
120                                                                         .getIndex()));
121                                                 }
122                                         }
123                                 }
124                                 this.connect(context, user); // Updates the session context
125
126                                 initializationScreenContext(Constants.NONE);
127
128                                 res = _backmenu;
129                                 if (res == null || "null".equals(res) || res.isEmpty()) {
130                                         res = Constants.NONE;
131                                 }
132                         } catch (FailedLoginException error) {
133                                 setErrorCode("message.error.login." + error.getMessage());
134                                 res = INPUT;
135                         } catch (Exception error) {
136                                 LOG.error("Reason:", error);
137                                 res = ERROR;
138                         }
139                 }
140                 return res;
141         }
142
143         /**
144          * Disconnect the current user from SIMAN application.
145          * 
146          * @return SUCCESS if disconnected, ERROR - if exception is caught
147          */
148         @SuppressWarnings("unchecked")
149         public String doLogout() {
150                 String res;
151                 try {
152                         Map<String, Object> session = getSession();
153                         // Map<String,Object> kfilter = (Map<String, Object>)session.get("knowledge.filter");
154                         Map<String, Object> sfilter = (Map<String, Object>) session
155                                         .get("study.filter");
156                         LoginContext context = (LoginContext) session.get("login.context");
157
158                         String connectedUsr = "";
159                         if (getConnectedUser() != null) {
160                                 connectedUsr = getConnectedUser().toString();
161                         }
162
163                         LOG.info("Deconnection of " + connectedUsr + ".");
164
165                         if (context != null) {
166                                 context.logout();
167                         }
168
169                         // TODO: ProjectSettings.deleteDownloadDirectory(user);
170                         if (sfilter != null) {
171                                 sfilter.put("state", "ANY");
172                                 sfilter.put("author", "0");
173                         }
174
175                         this.disconnect(); // Updates the session context
176
177                         closeStudy();
178                         initializationScreenContext(Constants.NONE);
179
180                         res = _backmenu;
181                         if (res == null || "null".equals(res)) {
182                                 res = Constants.NONE;
183                         }
184                 } catch (Exception error) {
185                         LOG.error("Reason:", error);
186                         res = ERROR;
187                 }
188                 return res;
189         }
190
191         // ==============================================================================================================================
192         // Getters and setters
193         // ==============================================================================================================================
194
195         /**
196          * Get user name.
197          * 
198          * @return user name
199          */
200         public String getUsername() {
201                 return _username;
202         }
203
204         /**
205          * Get user password.
206          * 
207          * @return user password
208          */
209         public String getPassword() {
210                 return _password;
211         }
212
213         /**
214          * Set user name.
215          * 
216          * @param value
217          *            user name
218          */
219         public void setUsername(final String value) {
220                 this._username = value;
221         }
222
223         /**
224          * Set user password.
225          * 
226          * @param value
227          *            the password
228          */
229         public void setPassword(final String value) {
230                 this._password = value;
231         }
232
233         /**
234          * Set menu for the user.
235          * 
236          * @param menu
237          *            menu key string
238          */
239         public void setBackMenu(final String menu) {
240                 this._backmenu = menu;
241         }
242 }