package clientside; import constants.GameConstants; import database.DatabaseConnection; import java.io.PrintStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.regex.Matcher; import java.util.regex.Pattern; import tools.Triple; public class MapleCharacterUtil { private static final Pattern namePattern = Pattern.compile("[a-zA-Z0-9]{4,12}"); private static final Pattern petPattern = Pattern.compile("[a-zA-Z0-9]{4,12}"); public static final boolean canCreateChar(String name, boolean gm) { if ((getIdByName(name) != -1) || (!isEligibleCharName(name, gm))) { return false; } return true; } public static final boolean isEligibleCharName(String name, boolean gm) { if (name.length() > 12) { return false; } if (gm) { return true; } if ((name.length() < 3) || (!namePattern.matcher(name).matches())) { return false; } for (String z : GameConstants.RESERVED) { if (name.indexOf(z) != -1) { return false; } } return true; } public static final boolean canChangePetName(String name) { if (petPattern.matcher(name).matches()) { for (String z : GameConstants.RESERVED) { if (name.indexOf(z) != -1) { return false; } } return true; } return false; } public static final String makeMapleReadable(String in) { String wui = in.replace('I', 'i'); wui = wui.replace('l', 'L'); wui = wui.replace("rn", "Rn"); wui = wui.replace("vv", "Vv"); wui = wui.replace("VV", "Vv"); return wui; } public static final int getIdByName(String name) { Connection con = DatabaseConnection.getConnection(); try { PreparedStatement ps = con.prepareStatement("SELECT id FROM characters WHERE name = ?"); ps.setString(1, name); ResultSet rs = ps.executeQuery(); if (!rs.next()) { rs.close(); ps.close(); return -1; } int id = rs.getInt("id"); rs.close(); ps.close(); return id; } catch (SQLException e) { System.err.println("error 'getIdByName' " + e); } return -1; } public static final int Change_SecondPassword(int accid, String password, String newpassword) { Connection con = DatabaseConnection.getConnection(); try { PreparedStatement ps = con.prepareStatement("SELECT * from accounts where id = ?"); ps.setInt(1, accid); ResultSet rs = ps.executeQuery(); if (!rs.next()) { rs.close(); ps.close(); return -1; } String secondPassword = rs.getString("2ndpassword"); String salt2 = rs.getString("salt2"); if ((secondPassword != null) && (salt2 != null)) { secondPassword = LoginCrypto.rand_r(secondPassword); } else if ((secondPassword == null) && (salt2 == null)) { rs.close(); ps.close(); return 0; } if (!check_ifPasswordEquals(secondPassword, password, salt2)) { rs.close(); ps.close(); return 1; } rs.close(); ps.close(); String SHA1hashedsecond; try { SHA1hashedsecond = LoginCryptoLegacy.encodeSHA1(newpassword); } catch (Exception e) { return -2; } ps = con.prepareStatement("UPDATE accounts set 2ndpassword = ?, salt2 = ? where id = ?"); ps.setString(1, SHA1hashedsecond); ps.setString(2, null); ps.setInt(3, accid); if (!ps.execute()) { ps.close(); return 2; } ps.close(); return -2; } catch (SQLException e) { System.err.println("error 'getIdByName' " + e); } return -2; } private static final boolean check_ifPasswordEquals(String passhash, String pwd, String salt) { if ((LoginCryptoLegacy.isLegacyPassword(passhash)) && (LoginCryptoLegacy.checkPassword(pwd, passhash))) { return true; } if ((salt == null) && (LoginCrypto.checkSha1Hash(passhash, pwd))) { return true; } if (LoginCrypto.checkSaltedSha512Hash(passhash, pwd, salt)) { return true; } return false; } public static Triple<Integer, Integer, Integer> getInfoByName(String name, int world) { try { Connection con = DatabaseConnection.getConnection(); PreparedStatement ps = con.prepareStatement("SELECT * FROM characters WHERE name = ? AND world = ?"); ps.setString(1, name); ps.setInt(2, world); ResultSet rs = ps.executeQuery(); if (!rs.next()) { rs.close(); ps.close(); return null; } Triple id = new Triple(Integer.valueOf(rs.getInt("id")), Integer.valueOf(rs.getInt("accountid")), Integer.valueOf(rs.getInt("gender"))); rs.close(); ps.close(); return id; } catch (Exception e) { e.printStackTrace(); } return null; } public static void setNXCodeUsed(String name, String code) throws SQLException { Connection con = DatabaseConnection.getConnection(); PreparedStatement ps = con.prepareStatement("UPDATE nxcode SET `user` = ?, `valid` = 0 WHERE code = ?"); ps.setString(1, name); ps.setString(2, code); ps.execute(); ps.close(); } public static void sendNote(String to, String name, String msg, int fame) { try { Connection con = DatabaseConnection.getConnection(); PreparedStatement ps = con.prepareStatement("INSERT INTO notes (`to`, `from`, `message`, `timestamp`, `gift`) VALUES (?, ?, ?, ?, ?)"); ps.setString(1, to); ps.setString(2, name); ps.setString(3, msg); ps.setLong(4, System.currentTimeMillis()); ps.setInt(5, fame); ps.executeUpdate(); ps.close(); } catch (SQLException e) { System.err.println("Unable to send note" + e); } } public static Triple<Boolean, Integer, Integer> getNXCodeInfo(String code) throws SQLException { Triple ret = null; Connection con = DatabaseConnection.getConnection(); PreparedStatement ps = con.prepareStatement("SELECT `valid`, `type`, `item` FROM nxcode WHERE code LIKE ?"); ps.setString(1, code); ResultSet rs = ps.executeQuery(); if (rs.next()) { ret = new Triple(Boolean.valueOf(rs.getInt("valid") > 0), Integer.valueOf(rs.getInt("type")), Integer.valueOf(rs.getInt("item"))); } rs.close(); ps.close(); return ret; } }