001package org.apache.turbine.om.security; 002 003/* 004 * Licensed to the Apache Software Foundation (ASF) under one 005 * or more contributor license agreements. See the NOTICE file 006 * distributed with this work for additional information 007 * regarding copyright ownership. The ASF licenses this file 008 * to you under the Apache License, Version 2.0 (the 009 * "License"); you may not use this file except in compliance 010 * with the License. You may obtain a copy of the License at 011 * 012 * http://www.apache.org/licenses/LICENSE-2.0 013 * 014 * Unless required by applicable law or agreed to in writing, 015 * software distributed under the License is distributed on an 016 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 017 * KIND, either express or implied. See the License for the 018 * specific language governing permissions and limitations 019 * under the License. 020 */ 021 022import java.io.ByteArrayOutputStream; 023import java.io.PrintWriter; 024import java.util.Date; 025import java.util.HashMap; 026import java.util.Map; 027import java.util.Set; 028 029import javax.servlet.http.HttpSessionBindingEvent; 030 031import org.apache.fulcrum.security.model.turbine.entity.TurbineUser; 032import org.apache.fulcrum.security.model.turbine.entity.TurbineUserGroupRole; 033import org.apache.turbine.services.security.TurbineSecurity; 034import org.apache.turbine.util.ObjectUtils; 035 036/** 037 * This is the Default user implementation. It is a wrapper around 038 * a TurbineUser object 039 * 040 * @author <a href="mailto:tv@apache.org">Thomas Vandahl</a> 041 * @version $Id: TorqueUser.java 1199856 2011-11-09 17:06:04Z tv $ 042 */ 043 044public class DefaultUserImpl implements User 045{ 046 /** Serial version */ 047 private static final long serialVersionUID = -1866504873085624111L; 048 049 /** The date on which the user last accessed the application. */ 050 private Date lastAccessDate = null; 051 052 /** This is data that will survive a servlet engine restart. */ 053 private Map<String, Object> permStorage = null; 054 055 /** This is data that will not survive a servlet engine restart. */ 056 private Map<String, Object> tempStorage = null; 057 058 /** The Fulcrum user instance to delegate to */ 059 private TurbineUser userDelegate = null; 060 061 /** 062 * Constructor 063 * 064 * @param user the user object to wrap 065 */ 066 public DefaultUserImpl(TurbineUser user) 067 { 068 super(); 069 this.userDelegate = user; 070 setCreateDate(new Date()); 071 tempStorage = new HashMap<String, Object>(10); 072 setHasLoggedIn(Boolean.FALSE); 073 } 074 075 /** 076 * Implement this method if you wish to be notified when the User 077 * has been Bound to the session. 078 * 079 * @param hsbe Indication of value/session binding. 080 */ 081 @Override 082 public void valueBound(HttpSessionBindingEvent hsbe) 083 { 084 // Currently we have no need for this method. 085 } 086 087 /** 088 * Implement this method if you wish to be notified when the User 089 * has been Unbound from the session. 090 * 091 * @param hsbe Indication of value/session unbinding. 092 */ 093 @Override 094 public void valueUnbound(HttpSessionBindingEvent hsbe) 095 { 096 try 097 { 098 if (hasLoggedIn()) 099 { 100 TurbineSecurity.saveOnSessionUnbind(this); 101 } 102 } 103 catch (Exception e) 104 { 105 //Log.error("TorqueUser.valueUnbound(): " + e.getMessage(), e); 106 107 // To prevent messages being lost in case the logging system 108 // goes away before sessions get unbound on servlet container 109 // shutdown, print the stacktrace to the container's console. 110 ByteArrayOutputStream ostr = new ByteArrayOutputStream(); 111 e.printStackTrace(new PrintWriter(ostr, true)); 112 String stackTrace = ostr.toString(); 113 System.out.println(stackTrace); 114 } 115 } 116 117 /** 118 * Get the Name of the SecurityEntity. 119 * 120 * @return The Name of the SecurityEntity. 121 */ 122 @Override 123 public String getName() 124 { 125 return userDelegate.getName(); 126 } 127 128 /** 129 * Sets the Name of the SecurityEntity. 130 * 131 * @param name 132 * Name of the SecurityEntity. 133 */ 134 @Override 135 public void setName(String name) 136 { 137 userDelegate.setName(name); 138 } 139 140 /** 141 * Get the Id of the SecurityEntity. 142 * 143 * @return The Id of the SecurityEntity. 144 */ 145 @Override 146 public Object getId() 147 { 148 return userDelegate.getId(); 149 } 150 151 /** 152 * Sets the Id of the SecurityEntity. 153 * 154 * @param id 155 * The new Id of the SecurityEntity 156 */ 157 @Override 158 public void setId(Object id) 159 { 160 userDelegate.setId(id); 161 } 162 163 /** 164 * Returns the user's password. This method should not be used by 165 * the application directly, because it's meaning depends upon 166 * the implementation of UserManager that manages this particular 167 * user object. Some implementations will use this attribute for 168 * storing a password encrypted in some way, other will not use 169 * it at all, when user entered password is presented to some external 170 * authority (like NT domain controller) to validate it. 171 * See also {@link org.apache.turbine.services.security.UserManager#authenticate(User,String)}. 172 * 173 * @return A String with the password for the user. 174 */ 175 @Override 176 public String getPassword() 177 { 178 return userDelegate.getPassword(); 179 } 180 181 /** 182 * Set password. Application should not use this method 183 * directly, see {@link #getPassword()}. 184 * See also {@link org.apache.turbine.services.security.UserManager#changePassword(User,String,String)}. 185 * 186 * @param password The new password. 187 */ 188 @Override 189 public void setPassword(String password) 190 { 191 userDelegate.setPassword(password); 192 } 193 194 /** 195 * Returns the first name for this user. 196 * 197 * @return A String with the user's first name. 198 */ 199 200 @Override 201 public String getFirstName() 202 { 203 return userDelegate.getFirstName(); 204 } 205 206 /** 207 * Sets the first name for this user. 208 * 209 * @param firstName User's first name. 210 */ 211 @Override 212 public void setFirstName(String firstName) 213 { 214 userDelegate.setFirstName(firstName); 215 } 216 217 /** 218 * Returns the last name for this user. 219 * 220 * @return A String with the user's last name. 221 */ 222 @Override 223 public String getLastName() 224 { 225 return userDelegate.getLastName(); 226 } 227 228 /** 229 * Sets the last name for this user. 230 * 231 * @param lastName User's last name. 232 */ 233 @Override 234 public void setLastName(String lastName) 235 { 236 userDelegate.setLastName(lastName); 237 } 238 239 /** 240 * Returns the email address for this user. 241 * 242 * @return A String with the user's email address. 243 */ 244 @Override 245 public String getEmail() 246 { 247 return userDelegate.getEmail(); 248 } 249 250 /** 251 * Sets the email address. 252 * 253 * @param address The email address. 254 */ 255 @Override 256 public void setEmail(String address) 257 { 258 userDelegate.setEmail(address); 259 } 260 261 /** 262 * Returns the value of the objectdata for this user. 263 * Objectdata is a storage area used 264 * to store the permanent storage table from the User 265 * object. 266 * 267 * @return The bytes in the objectdata for this user 268 */ 269 @Override 270 public byte[] getObjectdata() 271 { 272 return userDelegate.getObjectdata(); 273 } 274 275 /** 276 * Sets the value of the objectdata for the user 277 * 278 * @param objectdata The new permanent storage for the user 279 */ 280 @Override 281 public void setObjectdata(byte[] objectdata) 282 { 283 userDelegate.setObjectdata(objectdata); 284 } 285 286 /** 287 * Get the User/Group/Role set associated with this entity 288 * 289 * @return a set of User/Group/Role relations 290 */ 291 @Override 292 public <T extends TurbineUserGroupRole> Set<T> getUserGroupRoleSet() 293 { 294 return userDelegate.getUserGroupRoleSet(); 295 } 296 297 /** 298 * Set the User/Group/Role set associated with this entity 299 * 300 * @param userGroupRoleSet 301 * a set of User/Group/Role relations 302 */ 303 @Override 304 public <T extends TurbineUserGroupRole> void setUserGroupRoleSet(Set<T> userGroupRoleSet) 305 { 306 userDelegate.setUserGroupRoleSet(userGroupRoleSet); 307 } 308 309 /** 310 * Add a User/Group/Role relation to this entity 311 * 312 * @param userGroupRole 313 * a User/Group/Role relation to add 314 */ 315 @Override 316 public void addUserGroupRole(TurbineUserGroupRole userGroupRole) 317 { 318 userDelegate.addUserGroupRole(userGroupRole); 319 } 320 321 /** 322 * Remove a User/Group/Role relation from this entity 323 * 324 * @param userGroupRole 325 * a User/Group/Role relation to remove 326 */ 327 @Override 328 public void removeUserGroupRole(TurbineUserGroupRole userGroupRole) 329 { 330 userDelegate.removeUserGroupRole(userGroupRole); 331 } 332 333 /** 334 * Gets the access counter for a user from perm storage. 335 * 336 * @return The access counter for the user. 337 */ 338 @Override 339 public int getAccessCounter() 340 { 341 try 342 { 343 return ((Integer) getPerm(User.ACCESS_COUNTER)).intValue(); 344 } 345 catch (Exception e) 346 { 347 return 0; 348 } 349 } 350 351 /** 352 * Gets the access counter for a user during a session. 353 * 354 * @return The access counter for the user for the session. 355 */ 356 @Override 357 public int getAccessCounterForSession() 358 { 359 try 360 { 361 return ((Integer) getTemp(User.SESSION_ACCESS_COUNTER)).intValue(); 362 } 363 catch (Exception e) 364 { 365 return 0; 366 } 367 } 368 369 /** 370 * Increments the permanent hit counter for the user. 371 */ 372 @Override 373 public void incrementAccessCounter() 374 { 375 // Ugh. Race city, here I come... 376 setAccessCounter(getAccessCounter() + 1); 377 } 378 379 /** 380 * Increments the session hit counter for the user. 381 */ 382 @Override 383 public void incrementAccessCounterForSession() 384 { 385 setAccessCounterForSession(getAccessCounterForSession() + 1); 386 } 387 388 /** 389 * Sets the access counter for a user, saved in perm storage. 390 * 391 * @param cnt The new count. 392 */ 393 @Override 394 public void setAccessCounter(int cnt) 395 { 396 setPerm(User.ACCESS_COUNTER, Integer.valueOf(cnt)); 397 } 398 399 /** 400 * Sets the session access counter for a user, saved in temp 401 * storage. 402 * 403 * @param cnt The new count. 404 */ 405 @Override 406 public void setAccessCounterForSession(int cnt) 407 { 408 setTemp(User.SESSION_ACCESS_COUNTER, Integer.valueOf(cnt)); 409 } 410 411 /** 412 * Gets the last access date for this User. This is the last time 413 * that the user object was referenced. 414 * 415 * @return A Java Date with the last access date for the user. 416 */ 417 @Override 418 public java.util.Date getLastAccessDate() 419 { 420 if (lastAccessDate == null) 421 { 422 setLastAccessDate(); 423 } 424 return lastAccessDate; 425 } 426 427 /** 428 * Sets the last access date for this User. This is the last time 429 * that the user object was referenced. 430 */ 431 @Override 432 public void setLastAccessDate() 433 { 434 lastAccessDate = new java.util.Date(); 435 } 436 437 /** 438 * Returns the permanent storage. This is implemented 439 * as a Map 440 * 441 * @return A Map. 442 */ 443 @Override 444 public Map<String, Object> getPermStorage() 445 { 446 if (permStorage == null) 447 { 448 byte [] objectdata = getObjectdata(); 449 450 if (objectdata != null) 451 { 452 permStorage = ObjectUtils.deserialize(objectdata); 453 } 454 455 if (permStorage == null) 456 { 457 permStorage = new HashMap<String, Object>(); 458 } 459 } 460 461 return permStorage; 462 } 463 464 /** 465 * This should only be used in the case where we want to make the 466 * data persistent. 467 * 468 * @param permStorage A Map. 469 */ 470 @Override 471 public void setPermStorage(Map<String, Object> permStorage) 472 { 473 if (permStorage != null) 474 { 475 this.permStorage = permStorage; 476 } 477 } 478 479 /** 480 * Returns the temporary storage. This is implemented 481 * as a Map 482 * 483 * @return A Map. 484 */ 485 @Override 486 public Map<String, Object> getTempStorage() 487 { 488 if (tempStorage == null) 489 { 490 tempStorage = new HashMap<String, Object>(); 491 } 492 return tempStorage; 493 } 494 495 /** 496 * This should only be used in the case where we want to save the 497 * data to the database. 498 * 499 * @param tempStorage A Map. 500 */ 501 @Override 502 public void setTempStorage(Map<String, Object> tempStorage) 503 { 504 if (tempStorage != null) 505 { 506 this.tempStorage = tempStorage; 507 } 508 } 509 510 /** 511 * Get an object from permanent storage. 512 * 513 * @param name The object's name. 514 * @return An Object with the given name. 515 */ 516 @Override 517 public Object getPerm(String name) 518 { 519 return getPermStorage().get(name); 520 } 521 522 /** 523 * Get an object from permanent storage; return default if value 524 * is null. 525 * 526 * @param name The object's name. 527 * @param def A default value to return. 528 * @return An Object with the given name. 529 */ 530 @Override 531 public Object getPerm(String name, Object def) 532 { 533 try 534 { 535 Object val = getPermStorage().get(name); 536 return (val == null ? def : val); 537 } 538 catch (Exception e) 539 { 540 return def; 541 } 542 } 543 544 /** 545 * Put an object into permanent storage. 546 * 547 * @param name The object's name. 548 * @param value The object. 549 */ 550 @Override 551 public void setPerm(String name, Object value) 552 { 553 getPermStorage().put(name, value); 554 } 555 556 /** 557 * Get an object from temporary storage. 558 * 559 * @param name The object's name. 560 * @return An Object with the given name. 561 */ 562 @Override 563 public Object getTemp(String name) 564 { 565 return getTempStorage().get(name); 566 } 567 568 /** 569 * Get an object from temporary storage; return default if value 570 * is null. 571 * 572 * @param name The object's name. 573 * @param def A default value to return. 574 * @return An Object with the given name. 575 */ 576 @Override 577 public Object getTemp(String name, Object def) 578 { 579 Object val; 580 try 581 { 582 val = getTempStorage().get(name); 583 if (val == null) 584 { 585 val = def; 586 } 587 } 588 catch (Exception e) 589 { 590 val = def; 591 } 592 return val; 593 } 594 595 /** 596 * Put an object into temporary storage. 597 * 598 * @param name The object's name. 599 * @param value The object. 600 */ 601 @Override 602 public void setTemp(String name, Object value) 603 { 604 getTempStorage().put(name, value); 605 } 606 607 /** 608 * Remove an object from temporary storage and return the object. 609 * 610 * @param name The name of the object to remove. 611 * @return An Object. 612 */ 613 @Override 614 public Object removeTemp(String name) 615 { 616 return getTempStorage().remove(name); 617 } 618 619 /** 620 * Returns the confirm value of the user 621 * 622 * @return The confirm value of the user 623 */ 624 @Override 625 public String getConfirmed() 626 { 627 return (String) getPerm(User.CONFIRM_VALUE); 628 } 629 630 /** 631 * Sets the new confirm value of the user 632 * 633 * @param confirm The new confirm value of the user 634 */ 635 @Override 636 public void setConfirmed(String confirm) 637 { 638 setPerm(User.CONFIRM_VALUE, confirm); 639 } 640 641 /** 642 * Returns the creation date of the user 643 * 644 * @return The creation date of the user 645 */ 646 @Override 647 public java.util.Date getCreateDate() 648 { 649 return (java.util.Date)getPerm(CREATE_DATE, new java.util.Date()); 650 } 651 652 /** 653 * Sets the new creation date of the user 654 * 655 * @param createDate The new creation date of the user 656 */ 657 @Override 658 public void setCreateDate(java.util.Date createDate) 659 { 660 setPerm(CREATE_DATE, createDate); 661 } 662 663 /** 664 * Returns the date of the last login of the user 665 * 666 * @return The date of the last login of the user 667 */ 668 @Override 669 public java.util.Date getLastLogin() 670 { 671 return (java.util.Date) getPerm(User.LAST_LOGIN); 672 } 673 674 /** 675 * Sets the new date of the last login of the user 676 * 677 * @param lastLogin The new the date of the last login of the user 678 */ 679 @Override 680 public void setLastLogin(java.util.Date lastLogin) 681 { 682 setPerm(User.LAST_LOGIN, lastLogin); 683 } 684 685 /** 686 * The user is considered logged in if they have not timed out. 687 * 688 * @return Whether the user has logged in. 689 */ 690 @Override 691 public boolean hasLoggedIn() 692 { 693 Boolean loggedIn = (Boolean) getTemp(User.HAS_LOGGED_IN); 694 return (loggedIn != null && loggedIn.booleanValue()); 695 } 696 697 /** 698 * This sets whether or not someone has logged in. hasLoggedIn() 699 * returns this value. 700 * 701 * @param value Whether someone has logged in or not. 702 */ 703 @Override 704 public void setHasLoggedIn(Boolean value) 705 { 706 setTemp(User.HAS_LOGGED_IN, value); 707 } 708 709 /** 710 * This method reports whether or not the user has been confirmed 711 * in the system by checking the User.CONFIRM_VALUE 712 * column in the users record to see if it is equal to 713 * User.CONFIRM_DATA. 714 * 715 * @return True if the user has been confirmed. 716 */ 717 @Override 718 public boolean isConfirmed() 719 { 720 String value = getConfirmed(); 721 return (value != null && value.equals(User.CONFIRM_DATA)); 722 } 723 724 /** 725 * Updates the last login date in the database. 726 * 727 * @exception Exception A generic exception. 728 */ 729 @Override 730 public void updateLastLogin() 731 throws Exception 732 { 733 setLastLogin(new java.util.Date()); 734 } 735 736 /** 737 * Get the delegated user 738 * 739 * @return the userDelegate 740 */ 741 public TurbineUser getUserDelegate() 742 { 743 return userDelegate; 744 } 745 746 /** 747 * Set the delegated user 748 * 749 * @param userDelegate the userDelegate to set 750 */ 751 public void setUserDelegate(TurbineUser userDelegate) 752 { 753 this.userDelegate = userDelegate; 754 } 755}