上周在电脑上安装了Bugzero,觉得做得不错,界面什么的比BugZilla好很多,准备在机器上长期使用,结果得瑟了几天后发现,未注册版本中,管理员只能创建五个用户,再创建新用户就会提示超出限制,实在让人泄气,具体现象如下:使用admin帐户登录后,进入User菜单,添加新用户失败,页面上打印错误信息如下。
User accounts have exceeded the limit, please upgrade to a full version.
憋了壹下午之后实在是不爽,就琢磨着把它给破解了,反正哥也是做JAVA开发的,想必那代码也不会难到哪里去,了不起花点时间读壹下。说干就干,于是打开eclipse并连上远程调试,在整个bugzero工程中搜索这段字符串,壹开始怀疑它是直接hardcode在class/jar文件中的,结果找了下没有结果,后来壹想,这个项目是支持国际化的,上面那段文件最有可能出现在properties文件里,所以就指定搜索properties文件,果然在文件/bugzero/WebRoot/WEB-INF/classes/conf/messages.properties里找到了它,如下所示:
jsp.no_active_issue=There Are No Active Issues For You jsp.no_query_result=No Issue Was Found. license.user_accounts.limit=User accounts have exceeded the limit, please upgrade to a full version. license.total.limit=Failed to save, limit has been exceeded. Please upgrade to a paid version.
接下来要想办法找到key=license.user_accounts.limit在代码中出现的位置。于是召唤出反编译神器JD-GUI,将bugzero.jar整个包加载到软件中,然后File->Save All Sources将反编译出的源代码保存到本地,接着在Notepad++里全局搜索字符串license.user_accounts.limit,果真在bugzero\src\com\websina\persistence\PersonEntity.java找到了,如下图所示:
if (0 == i) { String str = MessageCode.get("license.user_accounts.limit"); throw new InfoException(str); }
大致看了下整个类,基本是用户帐户信息的增删改操作,还附带有壹个用户登录的验证,没什么特别的。于是开始关注那个if语句中的i变量,在debug模式下壹路往上跟,最后果真让我找到了几处可疑的地方:
int i = Project.Edition.num5(); //此处省略部分代码 int j = Project.Edition.num5();
于是点进去具体看了看,Project.Edition.num5()对应的是Project类中的壹个常量:
public static final class Edition { private static int num5 = 5; private static int num99 = 99; //此处省略部分代码 } public static int num5() { return num5; } public static int num99() { return num99; }
到这里时我觉得那个num5与num99相当可疑,于是想:i与j的初始值是5,创建新用户的数量限制也是5,是不是有什么关联关系,于是没想那么多,直接把num99的值赋给了i与j,将其重新导出成JAR文件后,再用WinRAR将这个文件打开,展开层层目录,取出其中的PersonEntity.class文件,替换掉%TOMCAT_HOME%/webapps/bugzero/WEB-INF/lib/bugzero.jar中对应的class文件,重启tomcat,再用管理员登录进去,添加第六个用户,成功了,开心!后来我又认真看了下这段代码,99也是相当可疑的,因为未注册用户的BugZero中,每用户只能提交100个BUG,而这里却显示99,与临界值特别接近,极有可能也是壹个重要的突破口,不管三七二十壹,将num5与num99的值都修改成了9999,这样就不怕你限制我了,哼哼...
package com.websina.persistence; import com.websina.bean.AppContext; import com.websina.bean.Group; import com.websina.bean.Person; import com.websina.bean.Persons; import com.websina.bean.Project; import com.websina.bean.ReloadableManager; import com.websina.util.BooleanUtil; import com.websina.util.DynamicField; import com.websina.util.InfoException; import com.websina.util.MessageCode; import com.websina.util.StringUtil; import com.websina.util.log.Log; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.sql.Timestamp; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.Map; import java.util.Set; public class PersonEntity extends DatabaseEntity { public static void login(Person paramPerson) throws DBException, InfoException { int i = Project.Edition.num99();//99 if (i > 0) { monitor(i + 2); } String username = paramPerson.getUsername(); String password = paramPerson.getPassword(); if ((username == null) || (username.trim().length() == 0)) throw new InfoException(MessageCode.get("servlet.login.username_is_empty"));//Username is empty if ((!paramPerson.isAuthenticated()) && ((password == null) || (password.length() == 0))) { throw new InfoException(MessageCode.get("servlet.login.password_is_empty"));//Password is empty } boolean bool = false; int j = 0; int k = 0; long l = 0L; Connection localConnection = null; Statement localStatement = null; String str3 = null; try { localConnection = checkout(); SQLProc localSQLProc = SQLFileParser.make("login_person"); localSQLProc.setString(1, username); localSQLProc.setString(2, password); str3 = localSQLProc.getSqlString(); if (paramPerson.isAuthenticated()) { int n = str3.indexOf("AND password="); if (n != -1) { str3 = str3.substring(0, n); } } localStatement = localConnection.createStatement(); ResultSet localResultSet = localStatement.executeQuery(str3); if (localResultSet.next()) { paramPerson.setId(localResultSet.getInt(1)); paramPerson.setUsername(localResultSet.getString(2)); String str5; if ((str5 = localResultSet.getString(3)) != null) { str5 = str5.trim(); if ((paramPerson.getGroup() != null) && (!paramPerson.getGroup().equals(str5))) j = 1; else paramPerson.setGroup(str5); } else if (paramPerson.getGroup() != null) { j = 1; } if ((str5 = localResultSet.getString(4)) != null) { str5 = str5.trim(); if ((!paramPerson.getUsername().equals(paramPerson.getFullname())) && (!paramPerson.getFullname().equals(str5))) j = 1; else paramPerson.setFullname(str5); } else if (paramPerson.getFullname() != null) { j = 1; } if ((str5 = localResultSet.getString(5)) != null) { str5 = str5.trim(); if ((paramPerson.getEmail() != null) && (!paramPerson.getEmail().equals(str5))) j = 1; else paramPerson.setEmail(str5); } else if (paramPerson.getEmail() != null) { j = 1; } if ((str5 = localResultSet.getString(6)) != null) { str5 = str5.trim(); paramPerson.setDefaultProject(str5); paramPerson.setProject(str5); } try { if ((str5 = localResultSet.getString(7)) != null) paramPerson.setSignature(str5); } catch (SQLException localSQLException2) { if (Log.doDebug()) Log.debug(localSQLException2.getMessage() + " (Person.login: signature field is empty)"); } if ((str5 = localResultSet.getString(8)) != null) { paramPerson.setBrowseMode(str5.trim()); } if ((str5 = localResultSet.getString(9)) != null) { paramPerson.setCompany(str5.trim()); } if ((str5 = localResultSet.getString(10)) != null) { paramPerson.setAddress(str5.trim()); } if ((str5 = localResultSet.getString(11)) != null) { paramPerson.setPhone(str5.trim()); } k = localResultSet.getInt(12); try { Timestamp localTimestamp = localResultSet.getTimestamp(13); if (localTimestamp != null) l = localTimestamp.getTime(); } catch (SQLException localSQLException3) { if (Log.doDebug()) Log.debug(localSQLException3.getMessage() + " (Person.ts)"); } bool = true; } else if ((paramPerson.isAuthenticated()) && (paramPerson.getGroup() != null) && (paramPerson.getFullname() != null) && (paramPerson.getEmail() != null)) { bool = true; j = 1; } localResultSet.close(); commitQuery(localConnection); } catch (SQLException localSQLException1) { checkDB(localConnection, localSQLException1); error(localSQLException1, str3, null); } finally { close(localStatement); checkin(localConnection); } if (AppContext.getEnableAccountLockout()) { if (bool) { if (k > AppContext.getAccountLockoutThreshold()) { bool = (AppContext.getAccountLockoutDuration() > 0) && (System.currentTimeMillis() - l > AppContext.getAccountLockoutDuration()); } if ((bool) && (k > 0)) { paramPerson.setTimestamp(new Date()); resetFailedLoginCount(username, paramPerson.getTimestamp(), 0); } } else if ((Persons.getInstance().contains(username)) || (paramPerson.isAdmin())) { resetFailedLoginCount(username, new Date(), 1); } } if (bool) { System.out.println("bool is true, entered the system successfully."); if (paramPerson.isAdmin()) { if (false == paramPerson.isAuthenticated()) paramPerson.loadAdmin(); } else { if (j != 0) { int m = paramPerson.getId() == 0 ? 1 : 0; paramPerson.save(); if (m != 0) Persons.getInstance().add(paramPerson); else { Persons.getInstance().update(paramPerson); } ReloadableManager.invalidate("com.websina.bean.Persons"); } loadProjectList(paramPerson); loadStoredQuery(paramPerson); } } else { System.out.println("Line 185: bool is false here, login failed and exit."); String str4 = MessageCode.get("servlet.login.login_failed");//login failed for {0} str4 = StringUtil.replace(str4, username); Assert.doAssert(bool, str4); } } public static void loadProjectList(Person paramPerson) throws DBException, InfoException { if (paramPerson == null) { //throw exception: Sorry, to load the project list, you need to be properly logged in. String localObject1 = MessageCode.get("persistence.person.login_check"); localObject1 = StringUtil.replace((String)localObject1, "project list"); throw new InfoException((String)localObject1); } int i = paramPerson.getId(); if (i == 0) { //throw exception: loadProjectList: PersonId for {username} is 0, required to be > 0. String localObject1 = MessageCode.get("persistence.person.wrong_id"); localObject1 = StringUtil.replace((String)localObject1, paramPerson.getUsername()); throw new InfoException("loadProjectList: " + (String)localObject1); } Object localObject1 = loadProjectList(i, paramPerson); if (((Map)localObject1).isEmpty()) { //throw exception: {username} has no project assigned, please contact project manager. String localObject2 = MessageCode.get("persistence.person.no_project"); localObject2 = StringUtil.replace((String)localObject2, paramPerson.getUsername()); throw new InfoException((String)localObject2); } Object localObject2 = new DynamicField("projectList"); ((DynamicField)localObject2).set((Map)localObject1); paramPerson.setProjectList((DynamicField)localObject2); setDefaultProject(paramPerson); } private static Map loadProjectList(int paramInt, Person paramPerson) throws DBException { Connection localConnection = null; Statement localStatement = null; HashMap localHashMap = new HashMap(); String str1 = null; try { localConnection = checkout(); SQLProc localSQLProc = SQLFileParser.make("get_project_list"); localSQLProc.setInt(1, paramInt); str1 = localSQLProc.getSqlString(); localStatement = localConnection.createStatement(); ResultSet localObject1 = localStatement.executeQuery(str1); System.out.println("Line 239 SQL: " + str1); String str2; String str3; String str4; while (((ResultSet)localObject1).next()) { str2 = ((ResultSet)localObject1).getString(1); if (paramPerson == null) { localHashMap.put(str2, null); } else { str3 = ((ResultSet)localObject1).getString(2); str4 = ((ResultSet)localObject1).getString(3); if ((str3 == null) || (str3.trim().length() == 0)) { str3 = str2; } localHashMap.put(str2, str3); if ((str4 != null) && (str4.trim().length() > 0)) { paramPerson.addProjectGroup(str4, str2, str3); } } } ((ResultSet)localObject1).close(); if (paramPerson != null) { localSQLProc = SQLFileParser.make("get_project_list_by_group"); localSQLProc.setString(1, paramPerson.getGroup()); str1 = localSQLProc.getSqlString(); System.out.println("Line 265 SQL: " + str1); localObject1 = localStatement.executeQuery(str1); while (((ResultSet)localObject1).next()) { str2 = ((ResultSet)localObject1).getString(1); str3 = ((ResultSet)localObject1).getString(2); str4 = ((ResultSet)localObject1).getString(3); if ((str3 == null) || (str3.trim().length() == 0)) { str3 = str2; } localHashMap.put(str2, str3); if ((str4 != null) && (str4.trim().length() > 0)) { paramPerson.addProjectGroup(str4, str2, str3); } } ((ResultSet)localObject1).close(); } commitQuery(localConnection); Log.debug(str1); } catch (SQLException localSQLException) { checkDB(localConnection, localSQLException); //throw exception: Failed to load project list for person of Id = '{0}'. Object localObject1 = MessageCode.get("persistence.person.load_project_list_failed"); localObject1 = StringUtil.replace((String)localObject1, String.valueOf(paramInt)); error(localSQLException, str1, (String)localObject1); } finally { close(localStatement); checkin(localConnection); } return (Map)localHashMap; } private static void setDefaultProject(Person paramPerson) { String str = paramPerson.getProjectId(); DynamicField localDynamicField = paramPerson.getProjectList(); if ((localDynamicField != null) && (!localDynamicField.isEmpty()) && ((str == null) || (!localDynamicField.contains(str)))) { str = localDynamicField.getValue()[0]; paramPerson.setProject(str); } } public static void loadStoredQuery(Person paramPerson) throws DBException, InfoException { int i; if ((paramPerson == null) || ((i = paramPerson.getId()) == 0)) { //Sorry, to load the stored query, you need to be properly logged in. String str1 = MessageCode.get("persistence.person.login_check"); str1 = StringUtil.replace(str1, "stored query"); throw new InfoException(str1); } setDefaultProject(paramPerson); String str1 = paramPerson.getProjectId(); if (str1 == null) { return; } DynamicField localDynamicField1 = paramPerson.getStoredQuery(); DynamicField localDynamicField2 = paramPerson.getStoredReport(); localDynamicField1.clear(); localDynamicField2.clear(); Connection localConnection = null; Statement localStatement = null; String str2 = null; Set localSet = paramPerson.getRoles(); Group localGroup = Group.getInstance(); int j = (localGroup.isTypeGroup(localSet)) || (localGroup.isGuest(localSet)) || (localGroup.isTypeGuestGroup(localSet)) ? 1 : 0; try { localConnection = checkout(); SQLProc localSQLProc = null; if (j != 0) localSQLProc = SQLFileParser.make("get_query_list_group"); else { localSQLProc = SQLFileParser.make("get_query_list"); } localSQLProc.setInt(1, i); str2 = localSQLProc.getSqlString("$PROJECT", str1); if (j != 0) { String localObject1 = SQLExpr.stringIN(localSet); str2 = StringUtil.replace(str2, "$GROUPS", (String)localObject1); } localStatement = localConnection.createStatement(); ResultSet localObject1 = localStatement.executeQuery(str2); while (((ResultSet)localObject1).next()) { int k = ((ResultSet)localObject1).getInt(1); String str3 = ((ResultSet)localObject1).getString(2); String str4 = ((ResultSet)localObject1).getString(3); String str5 = ((ResultSet)localObject1).getString(4); String str6 = ((ResultSet)localObject1).getString(5); if ((BooleanUtil.getFlagAsBoolean(str5, false)) && (!paramPerson.getUsername().equals(str6))) { str3 = str3 + ' ' + '(' + str6 + ')'; } if ((str4 == null) || (str4.indexOf('0') != -1)) localDynamicField1.add(Integer.toString(k), str3); else { localDynamicField2.add(Integer.toString(k), str3); } } ((ResultSet)localObject1).close(); commitQuery(localConnection); Log.debug(str2); } catch (SQLException localSQLException) { checkDB(localConnection, localSQLException); Object localObject1 = MessageCode.get("persistence.person.load_stored_query_failed"); localObject1 = StringUtil.replace((String)localObject1, paramPerson.getUsername()); localObject1 = StringUtil.replace((String)localObject1, "{1}", str1); error(localSQLException, str2, (String)localObject1); } finally { close(localStatement); checkin(localConnection); } } public static Person load(int paramInt) throws DBException, InfoException { if (paramInt == 0) { return null; } Person localPerson = null; Connection localConnection = null; Statement localStatement = null; String str1 = null; try { localConnection = checkout(); SQLProc localSQLProc = SQLFileParser.make("get_person"); localSQLProc.setInt(1, paramInt); str1 = localSQLProc.getSqlString(); localStatement = localConnection.createStatement(); ResultSet localObject1 = localStatement.executeQuery(str1); if (((ResultSet)localObject1).next()) { localPerson = new Person(); localPerson.setId(paramInt); localPerson.setUsername(((ResultSet)localObject1).getString(1)); String str2; if ((str2 = ((ResultSet)localObject1).getString(2)) != null) localPerson.setPassword(str2.trim()); if ((str2 = ((ResultSet)localObject1).getString(3)) != null) localPerson.setGroup(str2.trim()); if ((str2 = ((ResultSet)localObject1).getString(4)) != null) localPerson.setFullname(str2.trim()); if ((str2 = ((ResultSet)localObject1).getString(5)) != null) { localPerson.setEmail(str2.trim()); } if ((str2 = ((ResultSet)localObject1).getString(6)) != null) localPerson.setDefaultProject(str2.trim()); try { if ((str2 = ((ResultSet)localObject1).getString(7)) != null) localPerson.setSignature(str2); } catch (SQLException localSQLException2) { if (Log.doDebug()) Log.debug(localSQLException2.getMessage() + " (Person.load: signature field is empty)"); } if ((str2 = ((ResultSet)localObject1).getString(8)) != null) { localPerson.setBrowseMode(str2.trim()); } if ((str2 = ((ResultSet)localObject1).getString(9)) != null) { localPerson.setActive(BooleanUtil.getStatusAsBoolean(str2, true)); } if ((str2 = ((ResultSet)localObject1).getString(10)) != null) { localPerson.setCompany(str2.trim()); } if ((str2 = ((ResultSet)localObject1).getString(11)) != null) { localPerson.setAddress(str2.trim()); } if ((str2 = ((ResultSet)localObject1).getString(12)) != null) { localPerson.setPhone(str2.trim()); } } ((ResultSet)localObject1).close(); commitQuery(localConnection); Log.debug(str1); } catch (SQLException localSQLException1) { checkDB(localConnection, localSQLException1); Object localObject1 = MessageCode.get("persistence.person.load_failed"); error(localSQLException1, str1, (String)localObject1); } finally { close(localStatement); checkin(localConnection); } return (Person)localPerson; } public static void save(Person paramPerson) throws DBException, InfoException { int i = paramPerson.getId(); int j = Project.Edition.num99(); if (j > 0) { if (i == 0) monitor(j + 1); else { monitor(j + 2); } } String str1 = paramPerson.getUsername(); if (str1 == null) { //username not set. String localObject1 = MessageCode.get("persistence.person.username_not_set"); throw new InfoException((String)localObject1); } if ((i == 0) && (getPerson(str1) != null)) { String localObject1 = MessageCode.get("persistence.person.username_exists"); localObject1 = StringUtil.replace((String)localObject1, str1); throw new InfoException((String)localObject1); } Object localObject1 = null; Statement localStatement = null; String str2 = null; try { localObject1 = checkout(); localStatement = ((Connection)localObject1).createStatement(); SQLProc localSQLProc = null; StringBuffer localObject2 = null; if (i == 0) { i = Sequence.getLast(Person.class); paramPerson.setId(i); localSQLProc = SQLFileParser.make("new_person"); localObject2 = new StringBuffer(" (new user: id=").append(i).append(')'); } else { localSQLProc = SQLFileParser.make("update_person"); localObject2 = new StringBuffer(" (user updated: id=").append(i).append(')'); } localSQLProc.setString(1, paramPerson.getGroup()); localSQLProc.setString(2, str1); localSQLProc.setString(3, paramPerson.getPassword()); localSQLProc.setString(4, paramPerson.getFullname()); localSQLProc.setString(5, paramPerson.getEmail()); localSQLProc.setString(6, paramPerson.getDefaultProjectId()); localSQLProc.setString(7, paramPerson.getSignature()); localSQLProc.setString(8, paramPerson.getBrowseMode()); localSQLProc.setString(9, paramPerson.getCompany()); localSQLProc.setString(10, paramPerson.getAddress()); localSQLProc.setString(11, paramPerson.getPhone()); localSQLProc.setInt(12, i); str2 = localSQLProc.getSqlString(); localStatement.executeUpdate(str2); commit((Connection)localObject1); String str3 = MessageCode.get("persistence.person.saved"); str3 = StringUtil.replace(str3, paramPerson.getUsername()); System.out.println("com.websina.persistence.PersonEntity.save(Line 512): " + ((StringBuffer)localObject2).insert(0, str3).toString()); } catch (SQLException localSQLException) { checkDB((Connection)localObject1, localSQLException); Object localObject2 = MessageCode.get("persistence.person.save_failed"); localObject2 = StringUtil.replace((String)localObject2, paramPerson.getUsername()); rollback(localSQLException, (Connection)localObject1, str2, (String)localObject2); } finally { close(localStatement); checkin((Connection)localObject1); } } public static void delete(Person paramPerson) throws DBException, InfoException { int i = paramPerson.getId(); if (i == 0) { String str = MessageCode.get("persistence.person.wrong_id"); str = StringUtil.replace(str, paramPerson.getUsername()); throw new InfoException(str); } delete(i, paramPerson); } public static void delete(String paramString) throws DBException, InfoException { Person localPerson = getPerson(paramString); if (localPerson == null) { String str = MessageCode.get("persistence.person.wrong_id"); str = StringUtil.replace(str, paramString); throw new InfoException(str); } delete(localPerson.getId(), localPerson); } public static void delete(int paramInt) throws DBException, InfoException { delete(paramInt, null); } public static void updatePassword(Person paramPerson) throws DBException { Connection localConnection = null; Statement localStatement = null; String str = null; try { localConnection = checkout(); SQLProc localSQLProc = SQLFileParser.make("update_person_password"); localSQLProc.setString(1, paramPerson.getPassword()); localSQLProc.setInt(2, paramPerson.getId()); str = localSQLProc.getSqlString(); localStatement = localConnection.createStatement(); localStatement.executeUpdate(str); commit(localConnection); if (Log.doDebug()) Log.debug("Password updated in database for user id=" + paramPerson.getId()); } catch (SQLException localSQLException) { rollback(localSQLException, localConnection, null); } finally { close(localStatement); checkin(localConnection); } } public static void updateTimestamp(Person paramPerson) throws DBException { Connection localConnection = null; Statement localStatement = null; String str = null; try { localConnection = checkout(); SQLProc localSQLProc = SQLFileParser.make("update_person_timestamp"); if (paramPerson.getTimestamp() == null) localSQLProc.setNull(1); else { localSQLProc.setTimestamp(1, new Timestamp(paramPerson.getTimestamp().getTime())); } localSQLProc.setInt(2, paramPerson.getId()); str = localSQLProc.getSqlString(); localStatement = localConnection.createStatement(); localStatement.executeUpdate(str); commit(localConnection); Log.debug(str); } catch (SQLException localSQLException) { rollback(localSQLException, localConnection, str, null); } finally { close(localStatement); checkin(localConnection); } } public static void updateStatus(Person paramPerson) throws DBException { Connection localConnection = null; Statement localStatement = null; String str1 = null; try { localConnection = checkout(); localStatement = localConnection.createStatement(); SQLProc localSQLProc = SQLFileParser.make("update_person_status"); localSQLProc.setString(1, paramPerson.isActive() ? null : BooleanUtil.getStatusAsString(false)); localSQLProc.setInt(2, paramPerson.getId()); str1 = localSQLProc.getSqlString(); localStatement.executeUpdate(str1); commit(localConnection); Log.debug(str1); } catch (SQLException localSQLException) { checkDB(localConnection, localSQLException); String str2 = MessageCode.get("persistence.person.save_failed"); str2 = StringUtil.replace(str2, paramPerson.getUsername()); rollback(localSQLException, localConnection, str1, str2); } finally { close(localStatement); checkin(localConnection); } } private static void delete(int paramInt, Person paramPerson) throws DBException, InfoException { if (paramPerson == null) paramPerson = load(paramInt); if (paramPerson == null) return; Set localSet = AssignmentEntity.getPersonProject(paramPerson.getUsername()); Object localObject2; Object localObject3; if ((localSet != null) && (!localSet.isEmpty())) { Iterator localObject1 = localSet.iterator(); localObject2 = new StringBuffer(); while (((Iterator)localObject1).hasNext()) { ((StringBuffer)localObject2).append((String)((Iterator)localObject1).next()); ((StringBuffer)localObject2).append("<br>"); } localObject3 = MessageCode.get("persistence.person.delete_assignment_first"); localObject3 = StringUtil.replace((String)localObject3, paramPerson.getUsername()); localObject3 = StringUtil.replace((String)localObject3, "{1}", ((StringBuffer)localObject2).toString()); throw new InfoException((String)localObject3); } Object localObject1 = null; try { localObject1 = checkout(); localObject2 = loadProjectList(paramInt, paramPerson); if (localObject2 != null) { localObject3 = ((Map)localObject2).keySet().iterator(); while (((Iterator)localObject3).hasNext()) { String str = (String)((Iterator)localObject3).next(); QueryEntity.removeStoredQuery((Connection)localObject1, str, paramInt); EmailTriggerEntity.deletePerson((Connection)localObject1, str, paramInt); } } AccessEntity.deletePerson((Connection)localObject1, paramInt); deletePerson((Connection)localObject1, paramInt); commit((Connection)localObject1); localObject3 = MessageCode.get("persistence.person.deleted"); localObject3 = StringUtil.replace((String)localObject3, String.valueOf(paramInt)); Log.info((String)localObject3); } catch (SQLException localSQLException) { checkDB((Connection)localObject1, localSQLException); localObject3 = MessageCode.get("persistence.person.delete_failed"); localObject3 = StringUtil.replace((String)localObject3, String.valueOf(paramInt)); localObject3 = StringUtil.replace((String)localObject3, "{1}", paramPerson.getUsername()); rollback(localSQLException, (Connection)localObject1, null, (String)localObject3); } finally { checkin((Connection)localObject1); } } private static void deletePerson(Connection paramConnection, int paramInt) throws DBException, SQLException { SQLProc localSQLProc = SQLFileParser.make("delete_person"); localSQLProc.setInt(1, paramInt); String str1 = localSQLProc.getSqlString(); Statement localStatement = paramConnection.createStatement(); try { localStatement.executeUpdate(str1); Log.debug(str1); } catch (SQLException localSQLException) { String str2 = localSQLException.getMessage(); int i = -1; if ((str2 != null) && (str2.indexOf('_') != -1)) { String str3 = str2.toLowerCase(); i = str3.indexOf("_trigger"); if (i == -1) i = str3.indexOf("_query"); } if (i != -1) { int j = str2.lastIndexOf('\'', i); if (j == -1) j = str2.lastIndexOf('"', i); if (j == -1) j = str2.lastIndexOf(' ', i); if (j == -1) throw localSQLException; j++; String str4 = str2.substring(j, i); QueryEntity.removeStoredQuery(paramConnection, str4, paramInt); EmailTriggerEntity.deletePerson(paramConnection, str4, paramInt); deletePerson(paramConnection, paramInt); } else { throw localSQLException; } } finally { close(localStatement); } } private static Person getPerson(String paramString) throws DBException, InfoException { if (paramString == null) { String localObject1 = MessageCode.get("persistence.person.username_not_set"); throw new InfoException((String)localObject1); } Object localObject1 = null; Connection localConnection = null; Statement localStatement = null; String str1 = null; try { localConnection = checkout(); SQLProc localSQLProc = SQLFileParser.make("get_person_username"); localSQLProc.setString(1, paramString); str1 = localSQLProc.getSqlString(); localStatement = localConnection.createStatement(); ResultSet localObject2 = localStatement.executeQuery(str1); if (((ResultSet)localObject2).next()) { localObject1 = new Person(); ((Person)localObject1).setUsername(paramString); ((Person)localObject1).setId(((ResultSet)localObject2).getInt(1)); String str2; if ((str2 = ((ResultSet)localObject2).getString(2)) != null) ((Person)localObject1).setPassword(str2.trim()); if ((str2 = ((ResultSet)localObject2).getString(3)) != null) ((Person)localObject1).setGroup(str2.trim()); if ((str2 = ((ResultSet)localObject2).getString(4)) != null) ((Person)localObject1).setFullname(str2.trim()); if ((str2 = ((ResultSet)localObject2).getString(5)) != null) ((Person)localObject1).setEmail(str2.trim()); } ((ResultSet)localObject2).close(); commitQuery(localConnection); Log.debug(str1); } catch (SQLException localSQLException) { checkDB(localConnection, localSQLException); Object localObject2 = "PersonEntity: " + localSQLException.getMessage(); error(localSQLException, str1, (String)localObject2); } finally { close(localStatement); checkin(localConnection); } return (Person)(Person)localObject1; } public static Set getGroupedUsers(String paramString, Set paramSet) throws DBException, InfoException { Connection localConnection = null; Statement localStatement = null; String str1 = null; HashSet localHashSet = null; try { localConnection = checkout(); SQLProc localSQLProc = SQLFileParser.make("get_grouped_users"); localSQLProc.setString(1, paramString); str1 = localSQLProc.getSqlString(); String str2 = SQLExpr.stringIN(paramSet); str1 = StringUtil.replace(str1, "$GROUPS", str2); localStatement = localConnection.createStatement(); ResultSet localResultSet = localStatement.executeQuery(str1); while (localResultSet.next()) { if (localHashSet == null) localHashSet = new HashSet(); localHashSet.add(localResultSet.getString(1)); } localResultSet.close(); commitQuery(localConnection); Log.debug(str1); } catch (SQLException localSQLException) { checkDB(localConnection, localSQLException); String str2 = "PersonEntity: " + localSQLException.getMessage(); error(localSQLException, str1, str2); } finally { close(localStatement); checkin(localConnection); } return localHashSet; } public static void resetFailedLoginCount(String paramString) throws DBException { resetFailedLoginCount(paramString, new Date(), 0); } private static void resetFailedLoginCount(String paramString, Date paramDate, int paramInt) throws DBException { Connection localConnection = null; Statement localStatement = null; String str1 = null; try { localConnection = checkout(); localStatement = localConnection.createStatement(); SQLProc localSQLProc = SQLFileParser.make("update_person_failed_logins_" + paramInt); localSQLProc.setTimestamp(1, new Timestamp(paramDate.getTime())); localSQLProc.setString(2, paramString); str1 = localSQLProc.getSqlString(); localStatement.executeUpdate(str1); commit(localConnection); Log.debug(str1); } catch (SQLException localSQLException) { checkDB(localConnection, localSQLException); String str2 = MessageCode.get("persistence.person.save_failed"); str2 = StringUtil.replace(str2, paramString); rollback(localSQLException, localConnection, str1, str2); } finally { close(localStatement); checkin(localConnection); } } private static void monitor(int paramInt) throws DBException, InfoException { Connection localConnection = null; Statement localStatement = null; int i = 0; try { localConnection = checkout(); localStatement = localConnection.createStatement(); ResultSet resultSet = localStatement.executeQuery("select count(*) from person"); //System.out.println("com.websina.persistence.PersonEntity.monitor(Line 836): localResultSet has " + resultSet.getInt(1) + "items."); if ((resultSet.next()) && (resultSet.getInt(1) < paramInt)) { i = 1; } resultSet.close(); commitQuery(localConnection); } catch (SQLException e) { checkDB(localConnection, e); throw new DBException(e); } finally { close(localStatement); checkin(localConnection); } if (0 == i) { String str = MessageCode.get("license.user_accounts.limit"); throw new InfoException(str); } } }