package com.idega.core.accesscontrol.data; import java.sql.Timestamp; import java.util.Collection; import java.util.Iterator; import javax.ejb.FinderException; import com.idega.data.GenericEntity; import com.idega.data.IDOException; import com.idega.data.query.CountColumn; import com.idega.data.query.MatchCriteria; import com.idega.data.query.SelectQuery; import com.idega.data.query.Table; import com.idega.user.data.Group; import com.idega.user.data.User; import com.idega.user.data.UserBMPBean; import com.idega.util.EncryptionType; public class LoginTableBMPBean extends GenericEntity implements LoginTable, EncryptionType { private static final long serialVersionUID = -581639181444967671L; public static String className = LoginTable.class.getName(); public static String _COLUMN_PASSWORD = "USR_PASSWORD"; private static final String ENTITY_NAME = "IC_LOGIN"; private static final String COLUMN_USER_LOGIN = "USER_LOGIN"; private static final String COLUMN_USER_PASSWORD = "USER_PASSWORD"; private static final String COLUMN_LAST_CHANGED = "LAST_CHANGED"; private static final String COLUMN_CHANGED_BY_USER = "CHANGED_BY_USER_ID"; private static final String COLUMN_CHANGED_BY_GROUP = "CHANGED_BY_GROUP_ID"; private static final String COLUMN_COUNT_SENT_TO_BANK = "bank_count"; private static final String COLUMN_LOGIN_TYPE = "LOGIN_TYPE"; private transient String unEncryptedUserPassword; @Override public void initializeAttributes() { addAttribute(this.getIDColumnName()); addAttribute(getColumnNameUserID(), "User id", true, true, Integer.class, "many-to-one", User.class); addAttribute(getUserLoginColumnName(), "User name", true, true, String.class, 32); addAttribute(getNewUserPasswordColumnName(), "Password (encrypted)", true, true, String.class, 255); // deprecated column addAttribute(getOldUserPasswordColumnName(), "Password (deprecated)", true, true, String.class, 20); addAttribute(getLastChangedColumnName(), "Last changed", true, true, Timestamp.class); addAttribute(getLoginTypeColumnName(), "Login type", true, true, String.class, 32); addAttribute(COLUMN_CHANGED_BY_USER, "Last changed by user id", true, true, Integer.class, "many-to-one", User.class); addAttribute(COLUMN_CHANGED_BY_GROUP, "Last changed by group id", true, true, Integer.class, "many-to-one", Group.class); addAttribute(COLUMN_COUNT_SENT_TO_BANK, "bank count", Integer.class); setNullable(getUserLoginColumnName(), false); setUnique(getUserLoginColumnName(), true); addIndex("IDX_LOGIN_REC_2", getUserIDColumnName()); addIndex("IDX_LOGIN_REC_3", new String[]{getUserIDColumnName(), getLoginTypeColumnName()}); addIndex("IDX_LOGIN_REC_4", new String[]{getUserIDColumnName(), getUserLoginColumnName()}); addIndex("IDX_LOGIN_REC_5", getUserLoginColumnName()); getEntityDefinition().setBeanCachingActiveByDefault(true); } @Override public void setDefaultValues() { setColumn(getOldUserPasswordColumnName(), "rugl"); } @Override public String getEntityName() { return ENTITY_NAME; } public static String getUserLoginColumnName() { return COLUMN_USER_LOGIN; } public static String getOldUserPasswordColumnName() { return COLUMN_USER_PASSWORD; } public static String getNewUserPasswordColumnName() { return _COLUMN_PASSWORD; } public static String getLastChangedColumnName() { return COLUMN_LAST_CHANGED; } public static String getLoginTypeColumnName() { return COLUMN_LOGIN_TYPE; } public static String getUserPasswordColumnName() { System.out.println("LoginTable - getUserPassordColumnName()"); System.out.println("caution: not save because of changes in entity"); Exception e = new Exception(); e.printStackTrace(); return _COLUMN_PASSWORD; } public static String getColumnNameUserID() { return UserBMPBean.getColumnNameUserID(); } /** * just sets the password column value as this string without encoding. */ @Override public void setUserPasswordInClearText(String password) { setColumn(getNewUserPasswordColumnName(), password); } /** * just returns the password column value as is. */ @Override public String getUserPasswordInClearText() { return getStringColumnValue(getNewUserPasswordColumnName()); } @Override public String getUserPassword() { String str = null; try { str = getStringColumnValue(getNewUserPasswordColumnName()); } catch (Exception ex) { ex.printStackTrace(); // str = null; } if (str == null) { try { String oldPass = getStringColumnValue(getOldUserPasswordColumnName()); if (oldPass != null) { char[] pass = new char[oldPass.length() / 2]; try { for (int i = 0; i < pass.length; i++) { pass[i] = (char) Integer.decode("0x" + oldPass.charAt(i * 2) + oldPass.charAt((i * 2) + 1)).intValue(); } oldPass = String.valueOf(pass); } catch (Exception ex) { ex.printStackTrace(); // oldPass = oldPass; } LoginTable table = ((LoginTableHome) getIDOHome(LoginTable.class)).findByPrimaryKey(this.getPrimaryKey()); table.setUserPassword(oldPass); table.store(); this.setUserPassword(oldPass); return oldPass; // this.setColumnAsNull(getOldUserPasswordColumnName()); } } catch (Exception ex) { ex.printStackTrace(); return getStringColumnValue(getOldUserPasswordColumnName()); } } if (str != null) { char[] pass = new char[str.length() / 2]; try { for (int i = 0; i < pass.length; i++) { pass[i] = (char) Integer.decode("0x" + str.charAt(i * 2) + str.charAt((i * 2) + 1)).intValue(); } return String.valueOf(pass); } catch (Exception ex) { ex.printStackTrace(); return str; } } return str; } @Override public void setUserPassword(String userPassword) { try { String str = ""; char[] pass = userPassword.toCharArray(); for (int i = 0; i < pass.length; i++) { String hex = Integer.toHexString(pass[i]); while (hex.length() < 2) { String s = "0"; s += hex; hex = s; } str += hex; } if (str.equals("") && !userPassword.equals("")) { str = null; } setColumn(getNewUserPasswordColumnName(), str); } catch (Exception ex) { ex.printStackTrace(); setColumn(getNewUserPasswordColumnName(), userPassword); } } @Override public void setUserLogin(String userLogin) { setColumn(getUserLoginColumnName(), userLogin); } @Override public String getUserLogin() { return getStringColumnValue(getUserLoginColumnName()); } @Override public int getUserId() { return getIntColumnValue(getUserIDColumnName()); } @Override public User getUser() { return (User) getColumnValue(getUserIDColumnName()); } @Override public void setUserId(Integer userId) { setColumn(getUserIDColumnName(), userId); } @Override public void setUserId(int userId) { setColumn(getUserIDColumnName(), userId); } @Override public void setUser(User user){ Integer userId = (Integer)user.getPrimaryKey(); setUserId(userId); } public static String getUserIDColumnName() { return UserBMPBean.getColumnNameUserID(); } @Override public void setChangedByGroup(Group group){ setColumn(COLUMN_CHANGED_BY_GROUP, group); } @Override public void setChangedByGroupId(int changedByGroupId){ setColumn(COLUMN_CHANGED_BY_GROUP, changedByGroupId); } @Override public int getChangedByGroupId(){ return getIntColumnValue(COLUMN_CHANGED_BY_GROUP); } @Override public Group getChangedByGroup(){ return (Group) getColumnValue(COLUMN_CHANGED_BY_GROUP); } @Override public void setChangedByUser(User changedByUser){ setColumn(COLUMN_CHANGED_BY_USER, changedByUser); } @Override public void setChangedByUserId(int changedByUserId){ setColumn(COLUMN_CHANGED_BY_USER, changedByUserId); } @Override public int getChangedByUserId(){ return getIntColumnValue(COLUMN_CHANGED_BY_USER); } @Override public User getChangedByUser(){ return (User) getColumnValue(COLUMN_CHANGED_BY_USER); } @Override public void setLastChanged(Timestamp when) { setColumn(getLastChangedColumnName(), when); } @Override public Timestamp getLastChanged() { return ((Timestamp) getColumnValue(getLastChangedColumnName())); } @Override public void setBankCount(int bankCount) { setColumn(COLUMN_COUNT_SENT_TO_BANK, bankCount); } @Override public int getBankCount() { return getIntColumnValue(COLUMN_COUNT_SENT_TO_BANK, 2); } /** * Sets both the intented encrypted password and the original unencrypted * password for temporary retrieval */ @Override public void setUserPassword(String encryptedPassword, String unEncryptedPassword) { this.unEncryptedUserPassword = unEncryptedPassword; this.setUserPassword(encryptedPassword); } /** * Gets the original password if the record is newly created, therefore it can * be retrieved , if this is not a newly created record the exception * PasswordNotKnown is thrown */ @Override public String getUnencryptedUserPassword() throws PasswordNotKnown { if (this.unEncryptedUserPassword == null) { throw new PasswordNotKnown(this.getUserLogin()); } else { return this.unEncryptedUserPassword; } } @Override public void setLoginType(String loginType) { setColumn(getLoginTypeColumnName(), loginType); } @Override public String getLoginType() { return getStringColumnValue(getLoginTypeColumnName()); } public Object ejbFindLoginForUser(User user) throws FinderException { Table table = new Table(this); SelectQuery query = new SelectQuery(table); query.addColumn(table.getColumn(getIDColumnName())); query.addCriteria(new MatchCriteria(table.getColumn(getColumnNameUserID()), MatchCriteria.EQUALS, user)); return idoFindOnePKByQuery(query); } public Collection ejbFindLoginsForUser(User user) throws FinderException { Table table = new Table(this); SelectQuery query = new SelectQuery(table); query.addColumn(table.getColumn(getIDColumnName())); query.addCriteria(new MatchCriteria(table.getColumn(getColumnNameUserID()), MatchCriteria.EQUALS, user)); return idoFindPKsByQuery(query); } public Object ejbFindLoginForUser(int userID) throws FinderException { Table table = new Table(this); SelectQuery query = new SelectQuery(table); query.addColumn(table.getColumn(getIDColumnName())); query.addCriteria(new MatchCriteria(table.getColumn(getColumnNameUserID()), MatchCriteria.EQUALS, userID)); return idoFindOnePKByQuery(query); } public Collection ejbFindLoginsForUser(int userID) throws FinderException { Table table = new Table(this); SelectQuery query = new SelectQuery(table); query.addColumn(table.getColumn(getIDColumnName())); query.addCriteria(new MatchCriteria(table.getColumn(getColumnNameUserID()), MatchCriteria.EQUALS, userID)); return idoFindPKsByQuery(query); } public int ejbHomeGetNumberOfLogins(String userName) throws IDOException { Table table = new Table(this); SelectQuery query = new SelectQuery(table); query.addColumn(new CountColumn(table, getIDColumnName())); query.addCriteria(new MatchCriteria(table.getColumn(getUserLoginColumnName()), MatchCriteria.EQUALS, userName)); return idoGetNumberOfRecords(query); } /** * Gets the <code>LoginTable</code> object for the given login. * * @param login * @return * @throws FinderException */ public Object ejbFindByLogin(String login) throws FinderException { //try to find it cached: Collection cachedEntities = this.getCachedEntities(); for (Iterator iter = cachedEntities.iterator(); iter.hasNext();) { LoginTable loginEntity = (LoginTable) iter.next(); if(loginEntity!=null){ String userLogin = loginEntity.getUserLogin(); if(userLogin!=null){ if(userLogin.equals(login)){ return loginEntity.getPrimaryKey(); } } } } //if it is not found in the cache query the database: Table table = new Table(this); SelectQuery query = new SelectQuery(table); query.addColumn(table.getColumn(getIDColumnName())); query.addCriteria(new MatchCriteria(table.getColumn(getUserLoginColumnName()), MatchCriteria.EQUALS, login)); return idoFindOnePKByQuery(query); } public Object ejbFindByUserAndLogin(User user, String login) throws FinderException { Table table = new Table(this); SelectQuery query = new SelectQuery(table); query.addColumn(table.getColumn(getIDColumnName())); query.addCriteria(new MatchCriteria(table.getColumn(getUserLoginColumnName()), MatchCriteria.EQUALS, login)); query.addCriteria(new MatchCriteria(table.getColumn(getColumnNameUserID()), MatchCriteria.EQUALS, user)); return idoFindOnePKByQuery(query); } public Object ejbFindByUserAndType(User user, String loginType) throws FinderException { Table table = new Table(this); SelectQuery query = new SelectQuery(table); query.addColumn(table.getColumn(getIDColumnName())); query.addCriteria(new MatchCriteria(table.getColumn(getLoginTypeColumnName()), MatchCriteria.EQUALS, loginType)); query.addCriteria(new MatchCriteria(table.getColumn(getColumnNameUserID()), MatchCriteria.EQUALS, user)); return idoFindOnePKByQuery(query); } /** * <p> * Finds the default (i.e. a login with no login type) for the User with id userId * </p> * @param userID * @return * @throws FinderException */ public Object ejbFindDefaultLoginForUser(int userID) throws FinderException { Table table = new Table(this); SelectQuery query = new SelectQuery(table); query.addColumn(table.getColumn(getIDColumnName())); query.addCriteria(new MatchCriteria(table.getColumn(getColumnNameUserID()), MatchCriteria.EQUALS, userID)); query.addCriteria(new MatchCriteria(table.getColumn(getLoginTypeColumnName()), MatchCriteria.IS,(String)null)); return idoFindOnePKByQuery(query); } public Object ejbFindDefaultLoginForUser(User user) throws FinderException { Integer iUserId = (Integer)user.getPrimaryKey(); int userId = iUserId.intValue(); return ejbFindDefaultLoginForUser(userId); } }