/* * This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the * Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that * it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program. If * not, see <http://www.gnu.org/licenses/>. */ package silentium.tools.accountmanager; import silentium.commons.ServerType; import silentium.commons.configuration.PropertiesParser; import silentium.commons.crypt.Base64; import silentium.commons.database.DatabaseFactory; import java.io.IOException; import java.io.InputStreamReader; import java.io.LineNumberReader; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * This class SQL Account Manager * * @author netimperia * @version $Revision: 2.3.2.1.2.3 $ $Date: 2005/08/08 22:47:12 $ */ public class SQLAccountManager { private static String _uname = ""; private static String _pass = ""; private static String _level = ""; private static String _mode = ""; public static void main(final String... args) throws SQLException, IOException, NoSuchAlgorithmException { ServerType.SERVER_TYPE = ServerType.AUTHSERVER; PropertiesParser.parse(); DatabaseFactory.init(); System.out.println("Please choose an option:"); System.out.println(""); System.out.println("1 - Create new account or update existing one (change pass and access level)."); System.out.println("2 - Change access level."); System.out.println("3 - Delete existing account."); System.out.println("4 - List accounts & access levels."); System.out.println("5 - Exit."); final LineNumberReader _in = new LineNumberReader(new InputStreamReader(System.in)); while (!("1".equals(_mode) || "2".equals(_mode) || "3".equals(_mode) || "4".equals(_mode) || "5".equals(_mode))) { System.out.print("Your choice: "); _mode = _in.readLine(); } if ("1".equals(_mode) || "2".equals(_mode) || "3".equals(_mode)) { if ("1".equals(_mode) || "2".equals(_mode) || "3".equals(_mode)) while (_uname.isEmpty()) { System.out.print("Username: "); _uname = _in.readLine().toLowerCase(); } if ("1".equals(_mode)) while (_pass.isEmpty()) { System.out.print("Password: "); _pass = _in.readLine(); } if ("1".equals(_mode) || "2".equals(_mode)) while (_level.isEmpty()) { System.out.print("Access level: "); _level = _in.readLine(); } } switch (_mode) { case "1": // Add or Update addOrUpdateAccount(_uname, _pass, _level); break; case "2": // Change Level changeAccountLevel(_uname, _level); break; case "3": // Delete System.out.print("Do you really want to delete this account ? Y/N : "); final String yesno = _in.readLine(); if ("Y".equals(yesno)) { // Yes deleteAccount(_uname); } break; case "4": // List printAccInfo(); break; } } private static void printAccInfo() throws SQLException { int count = 0; java.sql.Connection con = null; con = DatabaseFactory.getConnection(); final PreparedStatement statement = con.prepareStatement("SELECT login, access_level FROM accounts ORDER BY login ASC"); final ResultSet rset = statement.executeQuery(); while (rset.next()) { System.out.println(rset.getString("login") + " -> " + rset.getInt("access_level")); count++; } rset.close(); statement.close(); System.out.println("Number of accounts: " + count + "."); } private static void addOrUpdateAccount(final String account, final String password, final String level) throws IOException, SQLException, NoSuchAlgorithmException { // Encode Password final MessageDigest md = MessageDigest.getInstance("SHA"); byte[] newpass; newpass = password.getBytes("UTF-8"); newpass = md.digest(newpass); // Add to Base java.sql.Connection con = null; con = DatabaseFactory.getConnection(); final PreparedStatement statement = con.prepareStatement("REPLACE accounts (login, password, access_level) VALUES (?,?,?)"); statement.setString(1, account); statement.setString(2, Base64.encodeBytes(newpass)); statement.setString(3, level); statement.executeUpdate(); statement.close(); } private static void changeAccountLevel(final String account, final String level) throws SQLException { java.sql.Connection con = null; con = DatabaseFactory.getConnection(); // Check Account Exist PreparedStatement statement = con.prepareStatement("SELECT COUNT(*) FROM accounts WHERE login=?;"); statement.setString(1, account); final ResultSet rset = statement.executeQuery(); if (!rset.next()) { System.out.println("False"); } else if (rset.getInt(1) > 0) { // Exist // Update statement = con.prepareStatement("UPDATE accounts SET access_level=? WHERE login=?;"); statement.setEscapeProcessing(true); statement.setString(1, level); statement.setString(2, account); statement.executeUpdate(); System.out.println("Account " + account + " has been updated."); } else { // Not Exist System.out.println("Account " + account + " does not exist."); } rset.close(); // Close Connection statement.close(); } private static void deleteAccount(final String account) throws SQLException { java.sql.Connection con = null; con = DatabaseFactory.getConnection(); // Check Account Exist PreparedStatement statement = con.prepareStatement("SELECT COUNT(*) FROM accounts WHERE login=?;"); statement.setString(1, account); ResultSet rset = statement.executeQuery(); if (!rset.next()) { System.out.println("False"); rset.close(); } else if (rset.getInt(1) > 0) { rset.close(); // Account exist // Get Accounts ID ResultSet rcln; statement = con.prepareStatement("SELECT obj_Id, char_name, clanid FROM characters WHERE account_name=?;"); statement.setEscapeProcessing(true); statement.setString(1, account); rset = statement.executeQuery(); while (rset.next()) { System.out.println("Deleting character " + rset.getString("char_name") + "."); // Check If clan leader Remove Clan and remove all from it statement.close(); statement = con.prepareStatement("SELECT COUNT(*) FROM clan_data WHERE leader_id=?;"); statement.setString(1, rset.getString("clanid")); rcln = statement.executeQuery(); rcln.next(); if (rcln.getInt(1) > 0) { rcln.close(); // Clan Leader // Get Clan Name statement.close(); statement = con.prepareStatement("SELECT clan_name FROM clan_data WHERE leader_id=?;"); statement.setString(1, rset.getString("clanid")); rcln = statement.executeQuery(); rcln.next(); System.out.println("Deleting clan " + rcln.getString("clan_name") + "."); // Delete Clan Wars statement.close(); statement = con.prepareStatement("DELETE FROM clan_wars WHERE clan1=? OR clan2=?;"); statement.setEscapeProcessing(true); statement.setString(1, rcln.getString("clan_name")); statement.setString(2, rcln.getString("clan_name")); statement.executeUpdate(); rcln.close(); // Remove All From clan statement.close(); statement = con.prepareStatement("UPDATE characters SET clanid=0 WHERE clanid=?;"); statement.setString(1, rset.getString("clanid")); statement.executeUpdate(); // Delete Clan statement.close(); statement = con.prepareStatement("DELETE FROM clan_data WHERE clan_id=?;"); statement.setString(1, rset.getString("clanid")); statement.executeUpdate(); statement.close(); statement = con.prepareStatement("DELETE FROM clan_privs WHERE clan_id=?;"); statement.setString(1, rset.getString("clanid")); statement.executeUpdate(); statement.close(); statement = con.prepareStatement("DELETE FROM clan_subpledges WHERE clan_id=?;"); statement.setString(1, rset.getString("clanid")); statement.executeUpdate(); } else { rcln.close(); } // skills statement.close(); statement = con.prepareStatement("DELETE FROM character_skills WHERE char_obj_id=?;"); statement.setString(1, rset.getString("obj_Id")); statement.executeUpdate(); // shortcuts statement.close(); statement = con.prepareStatement("DELETE FROM character_shortcuts WHERE char_obj_id=?;"); statement.setString(1, rset.getString("obj_Id")); statement.executeUpdate(); // items statement.close(); statement = con.prepareStatement("DELETE FROM items WHERE owner_id=?;"); statement.setString(1, rset.getString("obj_Id")); statement.executeUpdate(); // recipebook statement.close(); statement = con.prepareStatement("DELETE FROM character_recipebook WHERE char_id=?;"); statement.setString(1, rset.getString("obj_Id")); statement.executeUpdate(); // quests statement.close(); statement = con.prepareStatement("DELETE FROM character_quests WHERE charId=?;"); statement.setString(1, rset.getString("obj_Id")); statement.executeUpdate(); // macroses statement.close(); statement = con.prepareStatement("DELETE FROM character_macroses WHERE char_obj_id=?;"); statement.setString(1, rset.getString("obj_Id")); statement.executeUpdate(); // friends statement.close(); statement = con.prepareStatement("DELETE FROM character_friends WHERE char_id=?;"); statement.setString(1, rset.getString("obj_Id")); statement.executeUpdate(); // boxaccess statement.close(); statement = con.prepareStatement("DELETE FROM boxaccess WHERE charname=?;"); statement.setString(1, rset.getString("char_name")); statement.executeUpdate(); // characters statement.close(); statement = con.prepareStatement("DELETE FROM characters WHERE obj_Id=?;"); statement.setString(1, rset.getString("obj_Id")); statement.executeUpdate(); } // Delete Account statement.close(); statement = con.prepareStatement("DELETE FROM accounts WHERE login=?;"); statement.setEscapeProcessing(true); statement.setString(1, account); statement.executeUpdate(); System.out.println("Account " + account + " has been deleted."); } else { // Not Exist System.out.println("Account " + account + " does not exist."); } // Close Connection rset.close(); statement.close(); con.close(); } }