1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package org.itracker.web.actions.base;
19
20 import java.io.IOException;
21 import java.net.MalformedURLException;
22 import java.net.URL;
23 import java.util.Date;
24 import java.util.Locale;
25 import java.util.Map;
26 import java.util.Set;
27
28 import javax.servlet.ServletException;
29 import javax.servlet.http.HttpServletRequest;
30 import javax.servlet.http.HttpServletResponse;
31 import javax.servlet.http.HttpSession;
32
33 import org.apache.log4j.Level;
34 import org.apache.log4j.Logger;
35 import org.apache.struts.Globals;
36 import org.apache.struts.action.Action;
37 import org.apache.struts.action.ActionErrors;
38 import org.apache.struts.action.ActionForm;
39 import org.apache.struts.action.ActionForward;
40 import org.apache.struts.action.ActionMapping;
41 import org.apache.struts.action.ActionMessage;
42 import org.apache.struts.action.ActionMessages;
43 import org.itracker.model.PermissionType;
44 import org.itracker.model.User;
45 import org.itracker.services.ConfigurationService;
46 import org.itracker.services.ITrackerServices;
47 import org.itracker.services.util.UserUtilities;
48 import org.itracker.web.util.Constants;
49 import org.itracker.web.util.LoginUtilities;
50 import org.itracker.web.util.RequestHelper;
51 import org.itracker.web.util.ServletContextUtils;
52 import org.itracker.web.util.SessionManager;
53
54
55
56
57
58
59
60
61
62
63
64 public abstract class ItrackerBaseAction extends Action {
65
66 private static final Logger log = Logger
67 .getLogger(ItrackerBaseAction.class);
68
69 public ItrackerBaseAction() {
70 super();
71 }
72
73
74 protected Map<Integer, Set<PermissionType>> getUserPermissions(
75 HttpSession session) {
76 return RequestHelper.getUserPermissions(session);
77 }
78
79
80
81
82
83
84
85
86
87
88
89
90 protected boolean hasPermission(int[] permissionsNeeded,
91 HttpServletRequest request, HttpServletResponse response)
92 throws IOException, ServletException {
93 if (isLoggedIn(request, response)) {
94 HttpSession session = request.getSession(false);
95 Map<Integer, Set<PermissionType>> permissions = (session == null) ? null
96 : getUserPermissions(session);
97 if (!UserUtilities.hasPermission(permissions, permissionsNeeded)) {
98 return false;
99 }
100 return true;
101 }
102 return false;
103 }
104
105
106
107
108
109
110
111
112
113
114
115 protected boolean hasPermission(int permissionNeeded,
116 HttpServletRequest request, HttpServletResponse response)
117 throws IOException, ServletException {
118
119 HttpSession session = request.getSession(false);
120 Map<Integer, Set<PermissionType>> permissionsMap = (session == null) ? null
121 : getUserPermissions(session);
122 if (UserUtilities.hasPermission(permissionsMap, permissionNeeded)) {
123 return true;
124 }
125
126
127 return false;
128 }
129
130
131
132
133
134
135
136
137
138
139
140 protected boolean isLoggedIn(HttpServletRequest request,
141 HttpServletResponse response) throws IOException, ServletException {
142
143
144
145
146
147
148
149
150
151
152 return true;
153 }
154
155
156
157
158
159
160
161 public String getBaseURL(HttpServletRequest request) {
162
163 String url = getITrackerServices().getConfigurationService().getSystemBaseURL();
164 if (null == url) {
165 url = new StringBuffer(request.getScheme()).append("://").append(
166 request.getServerName()).append(":").append(
167 request.getServerPort()).append(request.getContextPath())
168 .toString();
169
170 log
171 .warn("getBaseURL: no base-url is configured, determin from request. ("
172 + url + ")");
173 }
174 try {
175 return new URL(url).toExternalForm();
176 } catch (MalformedURLException e) {
177 log.warn("failed to get URL normalized, returning manual url: "
178 + url, e);
179 }
180 return url;
181 }
182
183
184
185
186
187
188
189 protected ITrackerServices getITrackerServices() {
190 ITrackerServices itrackerServices = ServletContextUtils
191 .getItrackerServices();
192 return itrackerServices;
193 }
194
195
196
197
198
199
200 public String getName() {
201 log.warn("getName: is deprecated");
202 return null;
203 }
204
205
206
207
208
209
210 public void setName(String value) {
211 log.warn("setName: is deprecated");
212
213 }
214
215
216
217
218
219
220 public String getPage() {
221 log.warn("getPage: is deprecated");
222 return null;
223 }
224
225
226
227
228
229
230 public void setPage(String value) {
231 log.warn("setPage: is deprecated");
232
233 }
234
235
236
237
238
239
240 public int getPermission() {
241 log.warn("getPermission: is deprecated");
242 return -1;
243 }
244
245
246
247
248
249
250 public void setPermission(int value) {
251 log.warn("setPermission: is deprecated");
252
253 }
254
255
256
257
258
259
260
261
262
263 public ActionForward loginRouter(ActionMapping mapping, ActionForm form,
264 HttpServletRequest request, HttpServletResponse response,
265 ActionForward thisactionforward) {
266 ActionForward forward = new ActionForward();
267 forward = null;
268 forward = thisactionforward;
269 boolean hasGlobalPermission;
270
271 log
272 .info("Starting loginRouter (formerly Checklogin tag) proceedure...");
273 ConfigurationService configurationService = getITrackerServices()
274 .getConfigurationService();
275 boolean allowSaveLogin = configurationService.getBooleanProperty(
276 "allow_save_login", true);
277
278 String requestPath = request.getRequestURI();
279 String redirectURL = request.getRequestURI().substring(
280 request.getContextPath().length())
281 + (request.getQueryString() != null ? "?"
282 + request.getQueryString() : "");
283 log.info("Setting redirectURL = " + redirectURL);
284
285 HttpSession session = request.getSession();
286
287 try {
288
289
290
291 if (session == null) {
292 log
293 .info("No session found, preparing for redirect (not yet implemented");
294
295
296 request.setAttribute(Constants.AUTH_REDIRECT_KEY, redirectURL);
297
298
299 return forward;
300 }
301
302
303 log
304 .info("Get user, login and permissions from session, if available there.");
305 User user = (User) session.getAttribute(Constants.USER_KEY);
306 if (user != null) {
307 log.info("Found User:" + user.getFirstName() + " "
308 + user.getLastName() + " in Session.");
309 }
310 String login = (user == null ? null : user.getLogin());
311 if (login != null) {
312 log.info("Found Login:" + login + " in Session.");
313 }
314 Map<Integer, Set<PermissionType>> permissionsMap = getUserPermissions(session);
315 if (permissionsMap != null) {
316 log
317 .info("Found Permissions:" + permissionsMap
318 + " in Session.");
319 }
320
321
322 log.info("Checkin if login in not null or empty");
323 if (login == null || login.equals("")) {
324 log.info("Login is null or empty");
325 if (LoginUtilities.checkAutoLogin(request, allowSaveLogin)) {
326 log.info("Trying autologin, because we found a cookie...");
327 forward = mapping.findForward("autologin");
328 return forward;
329
330 }
331
332 if (!requestPath.endsWith("/login.do")) {
333
334 request.setAttribute("pageTitleKey",
335 "itracker.web.login.title");
336 request.setAttribute("pageTitleArg", "");
337
338
339
340 request.setAttribute(Constants.AUTH_REDIRECT_KEY,
341 redirectURL);
342
343
344 forward = mapping.findForward("login");
345 return forward;
346 }
347
348 } else {
349 log.info("Login found...: " + login);
350 if (SessionManager.getSessionNeedsReset(login)) {
351
352 log.info("Resetting the Session stuff...");
353 session.removeAttribute(Constants.USER_KEY);
354 session.removeAttribute(Constants.PERMISSIONS_KEY);
355 user = null;
356 String newLogin = SessionManager.checkRenamedLogin(login);
357 user = LoginUtilities.setupSession((newLogin == null ? login
358 : newLogin), request, response);
359 SessionManager.removeRenamedLogin(login);
360 if (user == null
361 || user.getStatus() != UserUtilities.STATUS_ACTIVE) {
362 ActionErrors errors = new ActionErrors();
363 errors.add(ActionMessages.GLOBAL_MESSAGE,
364 new ActionMessage(
365 "itracker.web.error.login.inactive"));
366 request.setAttribute(Globals.ERROR_KEY, errors);
367
368
369 return forward;
370 }
371 }
372
373
374 log.info("Checkin again if user is null...");
375 if (user == null) {
376 request.setAttribute(Constants.AUTH_REDIRECT_KEY,
377 redirectURL);
378
379
380 return forward;
381
382
383 } else {
384 log.info("else...");
385 log.info("User, yes found...: " + user.getLogin());
386 log.info("If there is a user...");
387 permissionsMap = getUserPermissions(session);
388 SessionManager.updateSessionLastAccess(login);
389
390 hasGlobalPermission = true;
391
392
393 log
394 .info("Start check if permissions for this user are found...");
395 if (getPermission() >= 0) {
396 log.info("Permissions found...");
397 if (!UserUtilities.hasPermission(permissionsMap,
398 getPermission())) {
399 log
400 .info("But this user is not allowed by his permissions");
401 hasGlobalPermission = false;
402
403 request.setAttribute("hasGlobalPermission",
404 hasGlobalPermission);
405 if (!requestPath.endsWith("/unauthorized.do")) {
406
407
408 forward = mapping.findForward("unauthorized");
409 return forward;
410 }
411 }
412 }
413
414 }
415 }
416 } catch (Exception e) {
417
418
419
420 return forward;
421 }
422
423 return forward;
424 }
425
426 @Override
427 public Locale getLocale(HttpServletRequest request) {
428 Locale locale = super.getLocale(request);
429 if (null == locale) {
430 locale = LoginUtilities.getCurrentLocale(request);
431 }
432 return locale;
433 }
434
435
436
437
438
439
440
441
442
443
444
445 protected static void logTimeMillies(String message, Date startTime, Logger log,
446 Level level) {
447 if (log.isEnabledFor(level)) {
448 long milliesStart = startTime.getTime();
449 long milliesEnd = System.currentTimeMillis();
450 if (null == log) {
451 log = ItrackerBaseAction.log;
452 }
453 if (null == level) {
454 level = Level.INFO;
455 }
456
457 log.log(level, new StringBuilder().append("logTimeMillies: ").append(
458 message).append(" took ").append(milliesEnd - milliesStart)
459 .append("ms.").toString());
460
461
462 startTime.setTime(System.currentTimeMillis());
463 }
464 }
465
466
467
468
469
470
471
472
473 protected void handleException(Throwable t, ActionMessages messages, HttpServletRequest httpServletRequest) {
474 Object[] params = new Object[]{};
475 ActionMessage msg = new ActionMessage("itracker.web.error.system.message");
476 log.debug("An expection has happened in the ItrackerBaseAction with " +msg.getValues()+params.length+" parameters");
477
478 }
479
480 }