RequestAuthLogin

lxtopxm

Выдающийся
Местный
Сообщения
382
Розыгрыши
0
Репутация
239
Реакции
46
Баллы
1 375
Помогите переделать RequestAuthLogin

Вот мой код который переделан уже под авторизацию без пароля и логина но при компили ошибка что я не так сделал ?))

package l2next.loginserver.clientpackets;

import l2next.loginserver.Config;
import l2next.loginserver.GameServerManager;
import l2next.loginserver.IpBanManager;
import l2next.loginserver.L2LoginClient;
import l2next.loginserver.accounts.Account;
import l2next.loginserver.accounts.SessionManager;
import l2next.loginserver.crypt.PasswordHash;
import l2next.loginserver.gameservercon.GameServer;
import l2next.loginserver.gameservercon.lspackets.GetAccountInfo;
import l2next.loginserver.serverpackets.LoginFail;
import l2next.loginserver.serverpackets.LoginOk;
import l2next.loginserver.utils.Log;

import javax.crypto.Cipher;


public class RequestLogin extends L2LoginClientPacket {
private byte[] _raw = new byte[128];

@Override
protected void readImpl()
{
readD();
readB(_raw);
readD();
readH();
readC();
}

@Override
protected void runImpl() throws Exception
{
L2LoginClient client = getClient();

byte[] decrypted;
try
{
Cipher rsaCipher = Cipher.getInstance("RSA/ECB/nopadding");
rsaCipher.init(Cipher.DECRYPT_MODE, client.getRSAPrivateKey());
decrypted = rsaCipher.doFinal(_raw, 0x00, 0x80);
}
catch(Exception e)
{
client.closeNow();
return;
}

String user = new String(decrypted, 0x40, 14).trim();
user = user.toLowerCase();
String password = new String(decrypted, 0x60, 16).trim();

int currentTime = (int) (System.currentTimeMillis() / 1000L);

Account account = new Account(user);
account.restore();

String passwordHash = Config.DEFAULT_CRYPT.encrypt(password);

if(account.getPasswordHash() == null)
{
if(Config.AUTO_CREATE_ACCOUNTS && user.matches(Config.ANAME_TEMPLATE) && password.matches(Config.APASSWD_TEMPLATE))
{
account.setAllowedIP("");
account.setPasswordHash(passwordHash);
account.save();
}
else
{
client.close(LoginFail.LoginFailReason.REASON_USER_OR_PASS_WRONG);
return;
}
}

boolean passwordCorrect = account.getPasswordHash().equals(passwordHash);

if(!passwordCorrect)
// проверяем не зашифрован ли пароль одним из устаревших но
// поддерживаемых алгоритмов
{
for(PasswordHash c : Config.LEGACY_CRYPT)
{
if(c.compare(password, account.getPasswordHash()))
{
passwordCorrect = true;
account.setPasswordHash(passwordHash);
break;
}
}
}

if(!IpBanManager.getInstance().tryLogin(client.getIpAddress(), passwordCorrect))
{
client.closeNow();
return;
}

if(!passwordCorrect)
{
client.close(LoginFail.LoginFailReason.REASON_USER_OR_PASS_WRONG);
return;
}

if(account.getAccessLevel() < 0)
{
client.close(LoginFail.LoginFailReason.REASON_ACCESS_FAILED);
return;
}

if(account.getBanExpire() > currentTime)
{
client.close(LoginFail.LoginFailReason.REASON_ACCESS_FAILED);
return;
}

if(!account.isAllowedIP(client.getIpAddress()))
{
client.close(LoginFail.LoginFailReason.REASON_ATTEMPTED_RESTRICTED_IP);
return;
}

for(GameServer gs : GameServerManager.getInstance().getGameServers())
{
if(gs.getProtocol() >= 2 && gs.isAuthed())
{
gs.sendPacket(new GetAccountInfo(user));
}
}

account.setLastAccess(currentTime);
account.setLastIP(client.getIpAddress());

Log.LogAccount(account);

SessionManager.Session session = SessionManager.getInstance().openSession(account);

client.setAuthed(true);
client.setLogin(user);
client.setAccount(account);
client.setSessionKey(session.getSessionKey());
client.setState(L2LoginClient.LoginClientState.AUTHED);

client.sendPacket(new LoginOk(client.getSessionKey()));
}

}
 
Хорошо бы было дня начала лог с ошибкой выложить людям... :=_=:
 
Без пароля и логина ты явно не войдешь, так как проверка на наличие символов в полях происходит на уровне клиента.
 
Если делать вход без логина и пароля, тогда реализовывать нужно пакет а не изменять этот
 
compile-authserver:
[delete] Deleting directory C:\Users\Home\Desktop\Патч\build\classes
[mkdir] Created dir: C:\Users\Home\Desktop\Патч\build\classes
[javac] Compiling 58 source files to C:\Users\Home\Desktop\Патч\build\classes
[javac] warning: [path] bad path element "C:\Users\Home\Desktop\Патч\DataPack\lib\L2NT-Scripts.jar": no such file or directory
[javac] warning: [options] bootstrap class path not set in conjunction with -source 1.7
[javac] C:\Users\Home\Desktop\Патч\Src\l2next\loginserver\clientpackets\RequestAuthLogin.java:23: error: class RequestLogin is public, should be declared in a file named RequestLogin.java
[javac] public class RequestLogin extends L2LoginClientPacket {
[javac] ^
[javac] C:\Users\Home\Desktop\Патч\Src\l2next\loginserver\clientpackets\RequestAuthLogin.java:50: error: method closeNow in class MMOClient<T> cannot be applied to given types;
[javac] client.closeNow();
[javac] ^
[javac] required: boolean
[javac] found: no arguments
[javac] reason: actual and formal argument lists differ in length
[javac] where T is a type-variable:
[javac] T extends MMOConnection declared in class MMOClient
[javac] C:\Users\Home\Desktop\Патч\Src\l2next\loginserver\clientpackets\RequestAuthLogin.java:99: error: method closeNow in class MMOClient<T> cannot be applied to given types;
[javac] client.closeNow();
[javac] ^
[javac] required: boolean
[javac] found: no arguments
[javac] reason: actual and formal argument lists differ in length
[javac] where T is a type-variable:
[javac] T extends MMOConnection declared in class MMOClient
[javac] 3 errors
[javac] 2 warnings

BUILD FAILED
C:\Users\Home\Desktop\Патч\build.xml:166: Compile failed; see the compiler error output for details.
 
Без пароля и логина ты явно не войдешь, так как проверка на наличие символов в полях происходит на уровне клиента.
Данный вопрос решен_ осталось исправить Серверную часть и будет для вас лаунчер завторизациею.
 
Ну так у тебя класс называется RequestLogin, а файл RequestAuthLogin. В Java название файла должно совпадать с названием класса. А в вызове метода closeNow требуется указание аргумента типа boolean.
 
Последнее редактирование:
  • Мне нравится
Реакции: kick
Ну выручайте)
 
2-pn95zoE2k.jpg

Вот как щас (запускал клиент через лаунчер ) Осталось ток серверную часть исправить !
 
2-pn95zoE2k.jpg

Вот как щас (запускал клиент через лаунчер ) Осталось ток серверную часть исправить !
Перечитай мое сообщение еще раз, я ее отредактировал как раз в то время, когда ты ответил. Проморгал те 2 ошибки чет :D
 
Мля чесно я не очень шарю в JavA(
 

    GenCloud

    Баллов: -65
    9sn0
Мля чесно я не очень шарю в JavA(
Либо измени public class RequestLogin на public class RequestAuthLogin, либо переименуй RequestAuthLogin.java в RequestLogin.java. Но что-то мне подсказывает, что если ты его переименуешь, выбьет еще ошибку-две мол неправильные импорты.
 
И да реализовать на стороне LS обработку этого пакета с опкодом 0x0B, а то сервак будет молчать и дальше с места не сдвинется.
Реализовал пакет для захода:
package l2next.loginserver.clientpackets;

import l2next.loginserver.Config;
import l2next.loginserver.GameServerManager;
import l2next.loginserver.IpBanManager;
import l2next.loginserver.L2LoginClient;
import l2next.loginserver.accounts.Account;
import l2next.loginserver.accounts.SessionManager;
import l2next.loginserver.crypt.PasswordHash;
import l2next.loginserver.gameservercon.GameServer;
import l2next.loginserver.gameservercon.lspackets.GetAccountInfo;
import l2next.loginserver.serverpackets.LoginFail;
import l2next.loginserver.serverpackets.LoginOk;
import l2next.loginserver.utils.Log;

import javax.crypto.Cipher;

/**
* Новый пакет авторизации для захода без ввода логина и пароля
* Created by WoWan-SM on 17.07.2014.
* L2Dev.su
*/
public class RequestLogin extends L2LoginClientPacket {
private byte[] _raw = new byte[128];

@Override
protected void readImpl()
{
readD();
readB(_raw);
readD();
readH();
readC();
}

@Override
protected void runImpl() throws Exception
{
L2LoginClient client = getClient();

byte[] decrypted;
try
{
Cipher rsaCipher = Cipher.getInstance("RSA/ECB/nopadding");
rsaCipher.init(Cipher.DECRYPT_MODE, client.getRSAPrivateKey());
decrypted = rsaCipher.doFinal(_raw, 0x00, 0x80);
}
catch(Exception e)
{
client.closeNow();
return;
}

String user = new String(decrypted, 0x40, 14).trim();
user = user.toLowerCase();
String password = new String(decrypted, 0x60, 16).trim();

int currentTime = (int) (System.currentTimeMillis() / 1000L);

Account account = new Account(user);
account.restore();

String passwordHash = Config.DEFAULT_CRYPT.encrypt(password);

if(account.getPasswordHash() == null)
{
if(Config.AUTO_CREATE_ACCOUNTS && user.matches(Config.ANAME_TEMPLATE) && password.matches(Config.APASSWD_TEMPLATE))
{
account.setAllowedIP("");
account.setPasswordHash(passwordHash);
account.save();
}
else
{
client.close(LoginFail.LoginFailReason.REASON_USER_OR_PASS_WRONG);
return;
}
}

boolean passwordCorrect = account.getPasswordHash().equals(passwordHash);

if(!passwordCorrect)
// проверяем не зашифрован ли пароль одним из устаревших но
// поддерживаемых алгоритмов
{
for(PasswordHash c : Config.LEGACY_CRYPT)
{
if(c.compare(password, account.getPasswordHash()))
{
passwordCorrect = true;
account.setPasswordHash(passwordHash);
break;
}
}
}

if(!IpBanManager.getInstance().tryLogin(client.getIpAddress(), passwordCorrect))
{
client.closeNow();
return;
}

if(!passwordCorrect)
{
client.close(LoginFail.LoginFailReason.REASON_USER_OR_PASS_WRONG);
return;
}

if(account.getAccessLevel() < 0)
{
client.close(LoginFail.LoginFailReason.REASON_ACCESS_FAILED);
return;
}

if(account.getBanExpire() > currentTime)
{
client.close(LoginFail.LoginFailReason.REASON_ACCESS_FAILED);
return;
}

if(!account.isAllowedIP(client.getIpAddress()))
{
client.close(LoginFail.LoginFailReason.REASON_ATTEMPTED_RESTRICTED_IP);
return;
}

for(GameServer gs : GameServerManager.getInstance().getGameServers())
{
if(gs.getProtocol() >= 2 && gs.isAuthed())
{
gs.sendPacket(new GetAccountInfo(user));
}
}

account.setLastAccess(currentTime);
account.setLastIP(client.getIpAddress());

Log.LogAccount(account);

SessionManager.Session session = SessionManager.getInstance().openSession(account);

client.setAuthed(true);
client.setLogin(user);
client.setAccount(account);
client.setSessionKey(session.getSessionKey());
client.setState(L2LoginClient.LoginClientState.AUTHED);

client.sendPacket(new LoginOk(client.getSessionKey()));
}

}
 
Может я не правильно поннял ( может над новый пакет создать ?)
 
В общем я продуплил, это авторизация не без логина и пароля, а их вводом через командную строку. Ну да, это другой пакет. Если CMD-режим отключен - присылается обычный RequestAuthLogin, а если включен - RequestLogin. И судя по той ЗГ-шной теме, которая на скрине, их структура различается (хоть и чуток), ну и ID-шки тоже. У скриптов видать этот пакет не реализован, поэтому пишет мол "не знать такой пакет".
Что нужно сделать как минимум:
1) Реализовать сам пакет (ну или позычить с той темы, что ты и пытался, видать). При этом, если когда-то понадобится обычный вход через логин-меню, не трогая RequestAuthLogin.
2) Добавить обработку приходящего 0x0B пакета как RequestLogin, который ты реализовал. Делается это в L2*чето-там*СlientHandler (не помню точно).
Пример на лыже:
До:
case AUTHED_GG:
switch (opcode)
{
case 0x00:
packet = new RequestAuthLogin();
break;
default:
debugOpcode(opcode, state);
break;
}
break;
После:
import com.l2jvanusha.loginserver.network.clientpackets.RequestLogin;
...
case AUTHED_GG:
switch (opcode)
{
case 0x00:
packet = new RequestAuthLogin();
break;
case 0x0B:
packet = new RequestLogin();
break;
default:
debugOpcode(opcode, state);
break;
}
break;
Ну или что-то вроде.
 
А почему бы и нет?) Вон америкосы тоже перешли на такую авторизацию. Типа разочек ввел логин и пароль в лаунчере, клацнул на "автовход" и все. Удобно так-то.
А потом через 3 года словил вирусняк, перебил винду, а логин и пароль от игры забыл :D
 
А почему бы и нет?) Вон америкосы тоже перешли на такую авторизацию. Типа разочек ввел логин и пароль в лаунчере, клацнул на "автовход" и все. Удобно так-то.
А потом через 3 года словил вирусняк, перебил винду, а логин и пароль от игры забыл :D
для этого придумали авторизации через соц сети.
 
Назад
Сверху Снизу