1 41 package com.mvnforum.auth; 42 43 import java.sql.Timestamp ; 44 import java.util.*; 45 46 import javax.servlet.http.*; 47 48 import com.mvnforum.*; 49 import com.mvnforum.db.DAOFactory; 50 import net.myvietnam.mvncore.exception.*; 51 import net.myvietnam.mvncore.security.Encoder; 52 import net.myvietnam.mvncore.security.FloodControl; 53 import net.myvietnam.mvncore.util.*; 54 import net.myvietnam.mvncore.web.GenericRequest; 55 import net.myvietnam.mvncore.web.GenericResponse; 56 import net.myvietnam.mvncore.web.impl.GenericRequestServletImpl; 57 import net.myvietnam.mvncore.web.impl.GenericResponseServletImpl; 58 59 public class OnlineUserManager { 60 private static final int REMOVE_INTERVAL = 2000; 62 private static final String MVNFORUM_SESSION_USERNAME = "mvnforum.membername"; 63 private static final String MVNFORUM_SESSION_PASSWORD = "mvnforum.encodedpassword"; 64 65 private static final String MVNFORUM_COOKIE_USERNAME = "mvnforum.membername"; 66 private static final String MVNFORUM_COOKIE_PASSWORD = "mvnforum.encodedpassword"; 67 68 private static final String MVNFORUM_COOKIE_PATH = "/"; 69 70 public static final String PASSWORD_OF_METHOD_REALM = "Realm"; public static final String PASSWORD_OF_METHOD_CUSTOMIZATION = "Remote"; 73 private static OnlineUserManager instance = new OnlineUserManager(); 75 76 private Map userMap = new TreeMap(); 78 private long timeOfLastRemoveAction = 0; 79 private transient Vector onlineUserListeners; 80 81 private Authenticator authenticator = null; 82 83 private OnlineUserManager() { 84 } 85 86 public static OnlineUserManager getInstance() { 87 return instance; 88 } 89 90 public Authenticator getAuthenticator() { 91 return authenticator; 92 } 93 94 public void setAuthenticator(Authenticator authenticator) { 95 this.authenticator = authenticator; 96 } 97 98 104 public void processLogin(HttpServletRequest request, HttpServletResponse response) 105 throws AuthenticationException, AssertionException, DatabaseException, BadInputException, FloodException { 106 107 String memberName = ParamUtil.getParameter(request, "MemberName", true); 108 StringUtil.checkGoodName(memberName); String memberPassword = ""; 110 String memberPasswordMD5 = ParamUtil.getParameter(request, "md5pw", false); 111 if (memberPasswordMD5.length() == 0 || (memberPasswordMD5.endsWith("==") == false)) { 112 memberPassword = ParamUtil.getParameterPassword(request, "MemberMatkhau", 3, 0); 114 115 if (memberPassword.length() == 0) { 116 throw new AssertionException("Cannot allow memberPassword's length is 0. Serious Assertion Failed."); 117 } 118 } 119 120 processLogin(request, response, memberName, memberPassword, memberPasswordMD5); 121 151 } 152 153 156 public void processLogin(HttpServletRequest request, HttpServletResponse response, 157 String memberName, String memberPassword, String memberPasswordMD5) 158 throws AuthenticationException, AssertionException, DatabaseException, BadInputException, FloodException { 159 160 StringUtil.checkGoodName(memberName); 162 String currentIP = request.getRemoteAddr(); 163 try { 164 FloodControl.ensureNotReachMaximum(MVNForumGlobal.FLOOD_ID_LOGIN, currentIP); 166 167 OnlineUser user = null; 168 if (memberPassword.length() > 0) { 169 user = login(request, response, memberName, memberPassword, false); 171 } else { 172 user = login(request, response, memberName, memberPasswordMD5, true); 174 } 175 ((OnlineUserImpl)user).setAuthenticationType(OnlineUser.AUTHENTICATION_TYPE_HTML_FORM); 176 } catch (AuthenticationException ex) { 177 FloodControl.increaseCount(MVNForumGlobal.FLOOD_ID_LOGIN, currentIP); 179 180 if (ex.getReason() == NotLoginException.WRONG_PASSWORD) { 181 request.setAttribute("MemberName", memberName); } 183 throw ex; 184 } catch (FloodException fe) { 185 Locale locale = I18nUtil.getLocaleInRequest(request); 186 Integer maxWrongLogins = new Integer (FloodControl.getActionsPerHour(MVNForumGlobal.FLOOD_ID_LOGIN)); 187 String localizedMessage = MVNForumResourceBundle.getString(locale, "mvncore.exception.FloodException.login_too_many_times", new Object []{ maxWrongLogins }); 189 throw new FloodException(localizedMessage); 190 } 191 } 192 193 197 protected OnlineUser login(HttpServletRequest request, HttpServletResponse response, 198 String memberName, String memberPassword, boolean passwordEncoded) 199 throws AuthenticationException, DatabaseException, AssertionException { 200 201 try { 202 StringUtil.checkGoodName(memberName); 203 } catch (Exception ex) { 204 throw new AuthenticationException(ex.getMessage(), NotLoginException.WRONG_NAME); 205 } 206 String encodedPassword; 207 OnlineUser user; 208 209 if (passwordEncoded) { 210 encodedPassword = memberPassword; 211 user = ManagerFactory.getOnlineUserFactory().getAuthenticatedUser(request, response, memberName, encodedPassword, true); 212 } else { 213 encodedPassword = ManagerFactory.getOnlineUserFactory().getEncodedPassword(memberName, memberPassword); 214 user = ManagerFactory.getOnlineUserFactory().getAuthenticatedUser(request, response, memberName, encodedPassword, true); 216 } 217 218 HttpSession session = request.getSession(); 219 String sessionID = session.getId(); 220 setOnlineUser(sessionID, user); 221 222 if (null != encodedPassword) { 225 session.setAttribute(MVNFORUM_SESSION_USERNAME, memberName); 226 session.setAttribute(MVNFORUM_SESSION_PASSWORD, encodedPassword); 227 } 228 229 boolean fromLoginPage = ParamUtil.getParameterBoolean(request, "FromLoginPage"); 230 if ( fromLoginPage && (response != null) ) { 231 manageAutoLogin(memberName, encodedPassword, request, response); 232 } 233 234 ManagerFactory.getOnlineUserFactory().postLogin(request, response, user); 237 238 return user; 239 } 240 241 protected OnlineUser login(GenericRequest request, GenericResponse response, 242 String memberName, String memberPassword, boolean passwordEncoded) 243 throws AuthenticationException, DatabaseException, AssertionException { 244 245 try { 246 StringUtil.checkGoodName(memberName); 247 } catch (Exception ex) { 248 throw new AuthenticationException(ex.getMessage(), NotLoginException.WRONG_NAME); 249 } 250 251 String encodedPassword; 252 OnlineUser user; 253 254 if (passwordEncoded) { 255 encodedPassword = memberPassword; 256 user = ManagerFactory.getOnlineUserFactory().getAuthenticatedUser(request, null, memberName, encodedPassword, true); 257 258 } else { 259 encodedPassword = ManagerFactory.getOnlineUserFactory().getEncodedPassword(memberName, memberPassword); 260 user = ManagerFactory.getOnlineUserFactory().getAuthenticatedUser(request, null, memberName, encodedPassword, true); 262 } 263 264 String sessionID = request.getSessionId(); 265 setOnlineUser(sessionID, user); 266 267 273 274 279 280 ManagerFactory.getOnlineUserFactory().postLogin(null, null, user); 283 284 return user; 285 } 286 287 protected void manageAutoLogin(String memberName, String encodedPassword, 288 HttpServletRequest request, HttpServletResponse response) { 289 290 boolean autoLogin = ParamUtil.getParameterBoolean(request, "AutoLogin"); 291 if (autoLogin) { 292 int autoLoginExpire = (60 * 60 * 24) * 1; try { 294 autoLoginExpire = ParamUtil.getParameterInt(request, "AutoLoginExpire"); 295 } catch (Exception ex) { 296 } 298 Cookie nameCookie = new Cookie(MVNFORUM_COOKIE_USERNAME, Encoder.encodeURL(memberName)); 299 nameCookie.setMaxAge(autoLoginExpire); 300 nameCookie.setPath(MVNFORUM_COOKIE_PATH); 301 302 Cookie passwordCookie = new Cookie(MVNFORUM_COOKIE_PASSWORD, encodedPassword); 303 passwordCookie.setMaxAge(autoLoginExpire); 304 passwordCookie.setPath(MVNFORUM_COOKIE_PATH); 305 306 response.addCookie(nameCookie); 307 response.addCookie(passwordCookie); 308 } 309 } 310 311 public void logout(HttpServletRequest request, HttpServletResponse response) 312 throws DatabaseException, AssertionException, AuthenticationException { 313 314 GenericRequest genericRequest = new GenericRequestServletImpl(request); 315 GenericResponse genericResponse = new GenericResponseServletImpl(response); 316 317 logout(genericRequest, genericResponse); 318 } 319 320 public void logout(GenericRequest request, GenericResponse response) 321 throws DatabaseException, AssertionException, AuthenticationException { 322 323 String sessionID = request.getSessionId(); 324 325 OnlineUser oldUser = getOnlineUser(request); 326 String cssPath = oldUser.getCssPath(); 327 String logoPath = oldUser.getLogoPath(); 328 329 OnlineUser user = null; 330 if (authenticator == null) { 331 user = ManagerFactory.getOnlineUserFactory().getAnonymousUser(request); 335 user.setCssPath(cssPath); 336 user.setLogoPath(logoPath); 337 } 338 339 setOnlineUser(sessionID, user); 341 ManagerFactory.getOnlineUserFactory().logout(request, response); 342 343 request.setSessionAttribute(MVNFORUM_SESSION_USERNAME, null); 345 request.setSessionAttribute(MVNFORUM_SESSION_PASSWORD, null); 346 } 347 348 public void deleteCookie(HttpServletRequest request, HttpServletResponse response) { 349 350 Cookie nameCookie = new Cookie(MVNFORUM_COOKIE_USERNAME, ""); 351 nameCookie.setPath(MVNFORUM_COOKIE_PATH); 352 nameCookie.setMaxAge(0); 354 Cookie passwordCookie = new Cookie(MVNFORUM_COOKIE_PASSWORD, ""); 355 passwordCookie.setPath(MVNFORUM_COOKIE_PATH); 356 passwordCookie.setMaxAge(0); 358 response.addCookie(nameCookie); 359 response.addCookie(passwordCookie); 360 } 361 362 public OnlineUser getOnlineUser(GenericRequest request) 363 throws AuthenticationException, AssertionException, DatabaseException { 364 365 if (request.isServletRequest()) { 366 return getOnlineUser(request.getServletRequest()); 367 } 368 369 String sessionID = request.getSessionId(); 370 OnlineUser user = getOnlineUser(sessionID); 371 372 if ( (user != null) && (user.isGuest() == false) ) { 376 if (user.getAuthenticationType() == OnlineUser.AUTHENTICATION_TYPE_REALM){ 377 String currentRemoteUser = request.getRemoteUser(); 378 if (currentRemoteUser == null) { 379 logout(request, null ); 380 } else if (currentRemoteUser.equalsIgnoreCase(user.getMemberName()) == false) { 381 throw new AssertionException("ASSERTION: Current remote user should equals the current member in OnlineUser: Remote User: " + currentRemoteUser + ". But forum user is " + user.getMemberName() +". Please report bug to mvnForum developers."); 382 } 383 } else if (user.getAuthenticationType() == OnlineUser.AUTHENTICATION_TYPE_CUSTOMIZATION) { 384 String currentRemoteUser = StringUtil.getEmptyStringIfNull(authenticator.getRemoteUser(request)); 385 if (currentRemoteUser.equals("")) { 386 logout(request, null ); 387 } else if (currentRemoteUser.equalsIgnoreCase(user.getMemberName()) == false) { 388 throw new AssertionException("ASSERTION: Current remote user should equals the current member in OnlineUser: Remote User: " + currentRemoteUser + ". But forum user is " + user.getMemberName() +". Please report bug to mvnForum developers."); 389 } 390 } 391 } 392 394 user = getOnlineUser(sessionID); 396 397 boolean enableLoginInfoInRealm = MVNForumConfig.getEnableLoginInfoInRealm(); 398 if (user == null) { 399 user = ManagerFactory.getOnlineUserFactory().getAnonymousUser(request); 401 setOnlineUser(sessionID, user); 402 } 403 404 if (user.isGuest() && enableLoginInfoInRealm && (null != request.getRemoteUser())) { 405 String memberName = StringUtil.getEmptyStringIfNull(request.getRemoteUser()); 406 if ( memberName.length() > 0 ) { 407 try { 408 DAOFactory.getMemberDAO().findByAlternateKey_MemberName(memberName); 409 user = login(request, null, memberName, PASSWORD_OF_METHOD_REALM, true); 410 ((OnlineUserImpl)user).setAuthenticationType(OnlineUser.AUTHENTICATION_TYPE_REALM); 411 } catch (ObjectNotFoundException oe) { 412 } 414 } 415 } 416 417 boolean enableLoginInfoInCustomization = MVNForumConfig.getEnableLoginInfoInCustomization(); 419 if (authenticator == null) { 420 authenticator = ManagerFactory.getAuthenticator(); 421 } 422 if (authenticator != null) { 423 if (user.isGuest() && enableLoginInfoInCustomization && (null != authenticator.getRemoteUser(request))) { 424 String memberName = StringUtil.getEmptyStringIfNull(authenticator.getRemoteUser(request)); 425 if (memberName.length() > 0) { 426 try { 427 DAOFactory.getMemberDAO().findByAlternateKey_MemberName(memberName); 428 user = login(request, null, memberName, PASSWORD_OF_METHOD_CUSTOMIZATION, true); 429 ( (OnlineUserImpl) user).setAuthenticationType(OnlineUser.AUTHENTICATION_TYPE_CUSTOMIZATION); 430 } catch (ObjectNotFoundException oe) { 431 } 433 } 434 } 435 } 436 437 user.getOnlineUserAction().updateLastRequestTime(); 438 return user; 439 } 440 441 public OnlineUser getOnlineUser(HttpServletRequest request) 442 throws AuthenticationException, AssertionException, DatabaseException { 443 444 long currentTime = System.currentTimeMillis(); 445 if (currentTime - timeOfLastRemoveAction > REMOVE_INTERVAL) { removeTimeoutUsers(); 447 int currentOnlineUserCount = userMap.size(); 449 fireDataChanged(new OnlineUserEvent(this, currentOnlineUserCount)); 450 } 451 452 HttpSession session = request.getSession(); 453 String sessionID = session.getId(); 454 OnlineUser user = getOnlineUser(sessionID); 455 456 if ( (user != null) && (user.isGuest() == false) ) { 460 if (user.getAuthenticationType() == OnlineUser.AUTHENTICATION_TYPE_REALM){ 461 String currentRemoteUser = request.getRemoteUser(); 462 if (currentRemoteUser == null) { 463 logout(request, null ); 464 } else if (currentRemoteUser.equalsIgnoreCase(user.getMemberName()) == false) { 465 throw new AssertionException("ASSERTION: Current remote user should equals the current member in OnlineUser. Please report bug to mvnForum developers."); 466 } 467 } else if (user.getAuthenticationType() == OnlineUser.AUTHENTICATION_TYPE_CUSTOMIZATION) { 468 String currentRemoteUser = StringUtil.getEmptyStringIfNull(authenticator.getRemoteUser(request)); 469 if (currentRemoteUser.equals("")) { 470 logout(request, null ); 471 } else if (currentRemoteUser.equalsIgnoreCase(user.getMemberName()) == false) { 472 throw new AssertionException("ASSERTION: Current remote user should equals the current member in OnlineUser. Please report bug to mvnForum developers."); 473 } 474 } 475 } 476 478 user = getOnlineUser(sessionID); 480 if (user == null) { 481 482 boolean enableLoginInfoInCookie = MVNForumConfig.getEnableLoginInfoInCookie(); 483 boolean enableLoginInfoInSession = MVNForumConfig.getEnableLoginInfoInSession(); 484 boolean enableLoginInfoInRealm = MVNForumConfig.getEnableLoginInfoInRealm(); 485 boolean enableLoginInfoInCustomization = MVNForumConfig.getEnableLoginInfoInCustomization(); 486 487 if ((user == null) && enableLoginInfoInSession) { 488 String memberName = ParamUtil.getAttribute(session, MVNFORUM_SESSION_USERNAME); 489 String encodedPassword = ParamUtil.getAttribute(session, MVNFORUM_SESSION_PASSWORD); 490 if ( (memberName.length() > 0) && (encodedPassword.length() > 0)) { 491 try { 492 user = login(request, null, memberName, encodedPassword, true); 493 ((OnlineUserImpl) user).setAuthenticationType(OnlineUser.AUTHENTICATION_TYPE_SESSION); 494 } catch (AuthenticationException e) { 495 } 498 } 499 } 500 if ((user == null) && enableLoginInfoInCookie) { 501 String memberName = ""; 502 String encodedPassword = ""; 503 Cookie[] cookies = request.getCookies(); 504 if (cookies != null) { 505 for (int i = 0; i < cookies.length; i++) { 506 Cookie cookie = cookies[i]; 507 String cookieName = cookie.getName(); 508 if (cookieName.equals(MVNFORUM_COOKIE_USERNAME)) { 509 memberName = Encoder.decodeURL(cookie.getValue()) ; 510 } else if (cookieName.equals(MVNFORUM_COOKIE_PASSWORD)) { 511 encodedPassword = cookie.getValue(); 512 } 513 } 514 } 515 if ( (memberName.length() > 0) && (encodedPassword.length() > 0) && 516 (encodedPassword.equalsIgnoreCase(PASSWORD_OF_METHOD_REALM) == false) && 517 (encodedPassword.equalsIgnoreCase(PASSWORD_OF_METHOD_CUSTOMIZATION) == false) ) { 518 try { 519 user = login(request, null, memberName, encodedPassword, true); 520 ((OnlineUserImpl)user).setAuthenticationType(OnlineUser.AUTHENTICATION_TYPE_COOKIE); 521 } catch (AuthenticationException e) { 522 } 525 } 526 } 527 if ((user == null) && enableLoginInfoInRealm && (null != request.getRemoteUser())) { 528 String memberName = StringUtil.getEmptyStringIfNull(request.getRemoteUser()); 529 if ( memberName.length() > 0 ) { 530 try { 531 DAOFactory.getMemberDAO().findByAlternateKey_MemberName(memberName); 532 user = login(request, null, memberName, PASSWORD_OF_METHOD_REALM, true); 533 ((OnlineUserImpl)user).setAuthenticationType(OnlineUser.AUTHENTICATION_TYPE_REALM); 534 } catch (ObjectNotFoundException oe) { 535 } 537 } 538 } 539 if ((user == null) && enableLoginInfoInCustomization) { 540 if (authenticator == null) { 541 authenticator = ManagerFactory.getAuthenticator(); 542 } 543 if (authenticator != null) { 544 String memberName = StringUtil.getEmptyStringIfNull(authenticator.getRemoteUser(request)); 545 if (memberName.length() > 0) { 546 try { 547 DAOFactory.getMemberDAO().findByAlternateKey_MemberName(memberName); 548 user = login(request, null, memberName, PASSWORD_OF_METHOD_CUSTOMIZATION, true); 549 ((OnlineUserImpl)user).setAuthenticationType(OnlineUser.AUTHENTICATION_TYPE_CUSTOMIZATION); 550 } catch (ObjectNotFoundException oe) { 551 } 553 } 554 } 555 } 556 if (user == null) { 557 user = ManagerFactory.getOnlineUserFactory().getAnonymousUser(request); 558 setOnlineUser(sessionID, user); 559 } 560 } else { boolean enableLoginInfoInRealm = MVNForumConfig.getEnableLoginInfoInRealm(); 563 if (user.isGuest() && enableLoginInfoInRealm && (null != request.getRemoteUser())) { 564 String memberName = StringUtil.getEmptyStringIfNull(request.getRemoteUser()); 565 if ( memberName.length() > 0 ) { 566 try { 567 DAOFactory.getMemberDAO().findByAlternateKey_MemberName(memberName); 568 user = login(request, null, memberName, PASSWORD_OF_METHOD_REALM, true); 569 ((OnlineUserImpl)user).setAuthenticationType(OnlineUser.AUTHENTICATION_TYPE_REALM); 570 } catch (ObjectNotFoundException oe) { 571 } 573 } 574 } 575 576 boolean enableLoginInfoInCustomization = MVNForumConfig.getEnableLoginInfoInCustomization(); 578 if (authenticator == null) { 579 authenticator = ManagerFactory.getAuthenticator(); 580 } 581 if (authenticator != null) { 582 if (user.isGuest() && enableLoginInfoInCustomization && (null != authenticator.getRemoteUser(request))) { 583 String memberName = StringUtil.getEmptyStringIfNull(authenticator.getRemoteUser(request)); 584 if (memberName.length() > 0) { 585 try { 586 DAOFactory.getMemberDAO().findByAlternateKey_MemberName(memberName); 587 user = login(request, null, memberName, PASSWORD_OF_METHOD_CUSTOMIZATION, true); 588 ( (OnlineUserImpl) user).setAuthenticationType(OnlineUser.AUTHENTICATION_TYPE_CUSTOMIZATION); 589 } catch (ObjectNotFoundException oe) { 590 } 592 } 593 } 594 } 595 } 596 user.getOnlineUserAction().updateLastRequestTime(); 597 return user; 598 } 599 600 public Collection getOnlineUserActions(int sortOption, boolean duplicateUsers) { 601 602 Collection collection = userMap.values(); 603 ArrayList retValue = new ArrayList(collection.size()); 606 607 if (duplicateUsers) { 609 for (Iterator memberIterator = collection.iterator(); memberIterator.hasNext(); ) { 610 OnlineUser onlineUser = (OnlineUser) memberIterator.next(); 611 if (onlineUser.isMember()) { 612 OnlineUserAction onlineUserAction = onlineUser.getOnlineUserAction(); 613 retValue.add(onlineUserAction); 614 } 615 } 616 } else { 617 Hashtable distinctUserActions = new Hashtable(); 619 OnlineUserAction lastUserAction = null; 620 for (Iterator memberIterator = collection.iterator(); memberIterator.hasNext(); ) { 621 OnlineUser onlineUser = (OnlineUser) memberIterator.next(); 622 if (onlineUser.isMember()) { 623 OnlineUserAction onlineUserAction = onlineUser.getOnlineUserAction(); 624 String memberName = onlineUserAction.getMemberName(); 625 onlineUserAction.resetSessionCount(); 626 lastUserAction = (OnlineUserAction) distinctUserActions.get(memberName); 627 if (lastUserAction == null) { 628 distinctUserActions.put(memberName, onlineUserAction); 629 } else if (onlineUserAction.getLastRequestTime().after(lastUserAction.getLastRequestTime())) { 630 distinctUserActions.put(memberName, onlineUserAction); 631 onlineUserAction.increaseSessionCount(lastUserAction.getSessionCount()); 632 } else { 633 lastUserAction.increaseSessionCount(1); 634 } 635 } 636 } 637 Collection distinctCollection = distinctUserActions.values(); 639 for (Iterator iterator = distinctCollection.iterator(); iterator.hasNext(); ) { 640 OnlineUserAction onlineUserAction = (OnlineUserAction)iterator.next(); 641 retValue.add(onlineUserAction); 642 } 643 } 644 645 for (Iterator guestIterator = collection.iterator(); guestIterator.hasNext(); ) { 647 OnlineUser onlineUser = (OnlineUser)guestIterator.next(); 648 if (onlineUser.isGuest()) { 649 OnlineUserAction onlineUserAction = onlineUser.getOnlineUserAction(); 650 retValue.add(onlineUserAction); 651 } 652 } 653 return retValue; 654 } 655 656 public void updateOnlineUserAction(HttpServletRequest request, Action action) 657 throws AssertionException, DatabaseException, AuthenticationException { 658 659 if (action != null) { 660 OnlineUser onlineUser = getOnlineUser(request); 661 OnlineUserAction onlineUserAction = onlineUser.getOnlineUserAction(); 662 onlineUserAction.setAction(action); 665 } 666 } 667 668 public synchronized boolean isUserOnline(String username) { 669 670 Collection collection = userMap.values(); 671 Iterator iterator = collection.iterator(); 672 while (iterator.hasNext()) { 673 OnlineUser onlineUser = (OnlineUser)iterator.next(); 674 String currentUser = onlineUser.getMemberName(); 675 if (username.equalsIgnoreCase(currentUser)) { 676 return true; 677 } 678 } 679 return false; 680 } 681 682 685 private synchronized OnlineUser getOnlineUser(String sessionID) { 686 687 return (OnlineUser)userMap.get(sessionID); 688 } 689 690 private synchronized void setOnlineUser(String sessionID, OnlineUser user) { 691 692 if (null == user) { 693 userMap.remove(sessionID); 694 } else { 695 userMap.put(sessionID, user); 696 } 697 } 698 699 private synchronized void removeTimeoutUsers() { 700 701 long currentTimeMillis = System.currentTimeMillis(); 702 if (currentTimeMillis - timeOfLastRemoveAction < REMOVE_INTERVAL) { 704 return; 705 } 706 timeOfLastRemoveAction = currentTimeMillis; 708 709 Timestamp currentTime = DateUtil.getCurrentGMTTimestamp(); 710 711 Collection collection = userMap.values(); 712 Iterator iterator = collection.iterator(); 713 while (iterator.hasNext()) { 714 OnlineUser onlineUser = (OnlineUser)iterator.next(); 715 OnlineUserAction onlineUserAction = onlineUser.getOnlineUserAction(); 716 long duration = currentTime.getTime() - onlineUserAction.getLastRequestTime().getTime(); 717 if (duration > MVNForumConfig.SESSION_DURATION) { 718 iterator.remove(); 719 } 720 } 721 } 722 723 726 public synchronized void removeOnlineUserListener(OnlineUserListener l) { 727 728 if (onlineUserListeners != null && onlineUserListeners.contains(l)) { 729 Vector v = (Vector) onlineUserListeners.clone(); 730 v.removeElement(l); 731 onlineUserListeners = v; 732 } 733 } 734 public synchronized void addOnlineUserListener(OnlineUserListener l) { 735 736 Vector v = onlineUserListeners == null ? new Vector(2) : (Vector) onlineUserListeners.clone(); 737 if (!v.contains(l)) { 738 v.addElement(l); 739 onlineUserListeners = v; 740 } 741 } 742 743 protected void fireDataChanged(OnlineUserEvent e) { 744 745 if (onlineUserListeners != null) { 746 Vector listeners = onlineUserListeners; 747 int count = listeners.size(); 748 for (int i = 0; i < count; i++) { 749 ((OnlineUserListener) listeners.elementAt(i)).dataChanged(e); 750 } 751 } 752 } 753 } 754 | Popular Tags |