Okay, I released this because many people wanted Auto Register, and the Other release OdinTeh Auto Register seems not working.
Im not sure if it would work for both versions, v62 and v75, but v75 100% works.
This will work 100%! :thumbup:
Okay, so Go to net.sf.odinms.client.LoginCrypto.java,
and Replace
קוד:
package net.sf.odinms.client;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;
import net.sf.odinms.tools.HexTool;
/**
*
* @author Frz
*/
public class LoginCrypto {
private LoginCrypto() {
}
private static String toSimpleHexString(byte[] bytes) {
return HexTool.toString(bytes).replace(" ", "").toLowerCase();
}
private static String hashWithDigest(String in, String digest) {
try {
MessageDigest Digester = MessageDigest.getInstance(digest);
Digester.update(in.getBytes("UTF-8"), 0, in.length());
byte[] sha1Hash = Digester.digest();
return toSimpleHexString(sha1Hash);
} catch (NoSuchAlgorithmException ex) {
throw new RuntimeException("Hashing the password failed", ex);
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("Encoding the string failed", e);
}
}
public static String hexSha1(String in) {
return hashWithDigest(in, "SHA-1");
}
private static String hexSha512(String in) {
return hashWithDigest(in, "SHA-512");
}
public static boolean checkSha1Hash(String hash, String password) {
return hash.equals(hexSha1(password));
}
public static boolean checkSaltedSha512Hash(String hash, String password, String salt) {
return hash.equals(makeSaltedSha512Hash(password, salt));
}
public static String makeSaltedSha512Hash(String password, String salt) {
return hexSha512(password + salt);
}
public static String makeSalt() {
byte[] salt = new byte[16];
new Random().nextBytes(salt);
return toSimpleHexString(salt);
}
}
Save/ and then make a new file AutoRegister.java in net.sf.odinms.client
and Place: Oh and, Where you can change the Accounts per IP, Ctrl + F and Find: private static final int ACCOUNTS_PER_IP = 5; and change the Number :3
קוד:
package net.sf.odinms.client;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.ResultSet;
import net.sf.odinms.database.DatabaseConnection;
public class AutoRegister {
private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(MapleClient.class);
private static final int ACCOUNTS_PER_IP = 5;
public static final boolean autoRegister = true;
public static boolean success;
public static boolean getAccountExists(String login) {
boolean accountExists = false;
Connection con = DatabaseConnection.getConnection();
try {
PreparedStatement ps = con.prepareStatement("SELECT name FROM accounts WHERE name = ?");
ps.setString(1, login);
ResultSet rs = ps.executeQuery();
if (rs.first()) {
accountExists = true;
}
} catch (Exception ex) {
}
return accountExists;
}
public static void createAccount(String login, String pwd, String eip) {
String sockAddr = eip;
Connection con;
try {
con = DatabaseConnection.getConnection();
} catch (Exception ex) {
log.error("ERROR", ex);
return;
}
try {
PreparedStatement ipc = con.prepareStatement("SELECT lastknownip FROM accounts WHERE lastknownip = ?");
ipc.setString(1, sockAddr.substring(1, sockAddr.lastIndexOf(':')));
ResultSet rs = ipc.executeQuery();
if (rs.first() == false || rs.last() == true && rs.getRow() < ACCOUNTS_PER_IP) {
try {
PreparedStatement ps = con.prepareStatement("INSERT INTO accounts (name, password, email, birthday, macs, lastknownip) VALUES (?, ?, ?, ?, ?, ?)");
ps.setString(1, login);
ps.setString(2, LoginCrypto.hexSha1(pwd));
ps.setString(3, "no@email.provided");
ps.setString(4, "0000-00-00");
ps.setString(5, "00-00-00-00-00-00");
ps.setString(6, sockAddr.substring(1, sockAddr.lastIndexOf(':')));
ps.executeUpdate();
ps.close();
success = true;
} catch (SQLException ex) {
log.error("ERROR", ex);
return;
}
}
ipc.close();
rs.close();
} catch (SQLException ex) {
}
}
}
Save/ Then make a New Java File in net.sf.odinms.client LoginCryptoLegacy.java and Place:
קוד:
package net.sf.odinms.client;
import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
public class LoginCryptoLegacy {
private static Logger log = LoggerFactory.getLogger(LoginCryptoLegacy.class);
/**
* Map of 6 bit nibbles to base64 characters.
*/
private static char[] iota64 = new char[64];
static {
int i = 0;
iota64[i++] = '.';
iota64[i++] = '/';
for (char c = 'A'; c <= 'Z'; c++)
iota64[i++] = c;
for (char c = 'a'; c <= 'z'; c++)
iota64[i++] = c;
for (char c = '0'; c <= '9'; c++)
iota64[i++] = c;
}
/**
* Class Constructor. Static class, so it's a dummy constructor.
*/
private LoginCryptoLegacy() {
}
/**
* Hash the password for first time storage.
*
* @param password The password to be hashed.
* @return String of the hashed password.
*/
public static String hashPassword(String password) {
byte[] randomBytes = new byte[6];
java.util.Random randomGenerator = new java.util.Random();
randomGenerator.nextBytes(randomBytes);
return myCrypt(password, genSalt(randomBytes));
}
/**
* Check a password against a hash.
*
* @param password The password to validate.
* @param hash The hash to validate against.
* @return <code>true</code> if the password is correct, <code>false</code> otherwise.
*/
public static boolean checkPassword(String password, String hash) {
return (myCrypt(password, hash).equals(hash));
}
public static boolean isLegacyPassword(String hash) {
return hash.substring(0, 3).equals("$H$");
}
/**
* Encrypt a string with <code>Seed</code> as a seed code.
*
* @param password Password to encrypt.
* @param seed Seed to use.
* @return The salted SHA1 hash of password.
* @throws RuntimeException
*/
private static String myCrypt(String password, String seed) throws RuntimeException {
String out = null;
int count = 8;
MessageDigest digester;
// Check for correct Seed
if (!seed.substring(0, 3).equals("$H$")) {
// Oh noes! Generate a seed and continue.
byte[] randomBytes = new byte[6];
java.util.Random randomGenerator = new java.util.Random();
randomGenerator.nextBytes(randomBytes);
seed = genSalt(randomBytes);
}
String salt = seed.substring(4, 12);
if (salt.length() != 8) {
throw new RuntimeException("Error hashing password - Invalid seed.");
}
byte[] sha1Hash = new byte[40];
try {
digester = MessageDigest.getInstance("SHA-1");
digester.update((salt + password).getBytes("iso-8859-1"), 0, (salt + password).length());
sha1Hash = digester.digest();
do {
byte[] CombinedBytes = new byte[sha1Hash.length + password.length()];
System.arraycopy(sha1Hash, 0, CombinedBytes, 0, sha1Hash.length);
System.arraycopy(password.getBytes("iso-8859-1"), 0, CombinedBytes, sha1Hash.length, password.getBytes("iso-8859-1").length);
digester.update(CombinedBytes, 0, CombinedBytes.length);
sha1Hash = digester.digest();
} while (--count > 0);
out = seed.substring(0, 12);
out += encode64(sha1Hash);
} catch (NoSuchAlgorithmException Ex) {
log.error("Error hashing password.", Ex);
} catch (UnsupportedEncodingException Ex) {
log.error("Error hashing password.", Ex);
}
if (out == null) {
throw new RuntimeException("Error hashing password - out = null");
}
return out;
}
/**
* Generates a salt string from random bytes <code>Random</code>
*
* @param Random Random bytes to get salt from.
* @return Salt string.
*/
private static String genSalt(byte[] Random) {
String Salt = "$H$";
Salt += iota64[30];
Salt += encode64(Random);
return Salt;
}
/**
* Encodes a byte array into base64.
*
* @param Input Array of bytes to put into base64.
* @return String of base64.
*/
private static String encode64(byte[] Input) {
int iLen = Input.length;
int oDataLen = (iLen * 4 + 2) / 3; // output length without padding
int oLen = ((iLen + 2) / 3) * 4; // output length including
// padding
char[] out = new char[oLen];
int ip = 0;
int op = 0;
while (ip < iLen) {
int i0 = Input[ip++] & 0xff;
int i1 = ip < iLen ? Input[ip++] & 0xff : 0;
int i2 = ip < iLen ? Input[ip++] & 0xff : 0;
int o0 = i0 >>> 2;
int o1 = ((i0 & 3) << 4) | (i1 >>> 4);
int o2 = ((i1 & 0xf) << 2) | (i2 >>> 6);
int o3 = i2 & 0x3F;
out[op++] = iota64[o0];
out[op++] = iota64[o1];
out[op] = op < oDataLen ? iota64[o2] : '=';
op++;
out[op] = op < oDataLen ? iota64[o3] : '=';
op++;
}
return new String(out);
}
}
Save/ Then go to net.sf.odinms.login.handler.LoginPasswordHandler.java
and Place:
קוד:
package net.sf.odinms.net.login.handler;
import net.sf.odinms.client.MapleCharacter;
import net.sf.odinms.client.MapleClient;
import net.sf.odinms.net.MaplePacketHandler;
import net.sf.odinms.net.login.LoginWorker;
import net.sf.odinms.tools.MaplePacketCreator;
import net.sf.odinms.tools.data.input.SeekableLittleEndianAccessor;
import net.sf.odinms.tools.KoreanDateUtil;
import java.util.Calendar;
import net.sf.odinms.client.AutoRegister;
public class LoginPasswordHandler implements MaplePacketHandler {
@Override
public boolean validateState(MapleClient c) {
return !c.isLoggedIn();
}
@Override
public void handlePacket(SeekableLittleEndianAccessor slea, MapleClient c) {
String login = slea.readMapleAsciiString();
String pwd = slea.readMapleAsciiString();
c.setAccountName(login);
int loginok = 0;
boolean ipBan = c.hasBannedIP();
boolean macBan = c.hasBannedMac();
if (AutoRegister.getAccountExists(login) != false) {
loginok = c.login(login, pwd, ipBan || macBan);
} else if (AutoRegister.autoRegister != false && (!ipBan || !macBan)) {
AutoRegister.createAccount(login, pwd, c.getSession().getRemoteAddress().toString());
if (AutoRegister.success != false) {
loginok = c.login(login, pwd, ipBan || macBan);
}
}
Calendar tempbannedTill = c.getTempBanCalendar();
if (loginok == 0 && (ipBan || macBan)) {
loginok = 3;
if (macBan) {
// this is only an ipban o.O" - maybe we should refactor this a bit so it's more readable
String[] ipSplit = c.getSession().getRemoteAddress().toString().split(":");
MapleCharacter.ban(ipSplit[0], "Enforcing account ban, account " + login, false);
}
}
if (loginok != 0) {
c.getSession().write(MaplePacketCreator.getLoginFailed(loginok));
return;
} else if (tempbannedTill.getTimeInMillis() != 0) {
long tempban = KoreanDateUtil.getTempBanTimestamp(tempbannedTill.getTimeInMillis());
byte reason = c.getBanReason();
c.getSession().write(MaplePacketCreator.getTempBan(tempban, reason));
return;
}
if (c.isGm()) {
LoginWorker.getInstance().registerGMClient(c);
} else {
LoginWorker.getInstance().registerClient(c);
}
}
}
Save! and Then Compile with w/e your using, dont ask me how to compile find a guide.
Good Luck! :thumbup:
If not, Download this and Copy Paste all of them, and Compile.
http://www.mediafire.com/?ntx0z4yyzyy