Archived
0

запрет входа на сервер

This commit is contained in:
2021-04-26 00:41:56 +03:00
parent f10af6ae69
commit fdc975d268
8 changed files with 140 additions and 8 deletions

View File

@@ -7,7 +7,9 @@ import lombok.RequiredArgsConstructor;
import mc.protocol.packets.Packet; import mc.protocol.packets.Packet;
import mc.protocol.packets.PacketDirection; import mc.protocol.packets.PacketDirection;
import mc.protocol.packets.client.HandshakePacket; import mc.protocol.packets.client.HandshakePacket;
import mc.protocol.packets.client.LoginStartPacket;
import mc.protocol.packets.client.StatusServerRequest; import mc.protocol.packets.client.StatusServerRequest;
import mc.protocol.packets.server.DisconnectPacket;
import mc.protocol.packets.server.StatusServerResponse; import mc.protocol.packets.server.StatusServerResponse;
import javax.annotation.Nullable; import javax.annotation.Nullable;
@@ -24,6 +26,12 @@ public enum State {
ImmutableBiMap.of(0x00, StatusServerRequest.class), ImmutableBiMap.of(0x00, StatusServerRequest.class),
// client bound // client bound
ImmutableBiMap.of(0x00, StatusServerResponse.class) ImmutableBiMap.of(0x00, StatusServerResponse.class)
),
LOGIN(2,
// server bound
ImmutableBiMap.of(0x00, LoginStartPacket.class),
// client bound
ImmutableBiMap.of(0x00, DisconnectPacket.class)
); );
@Nullable @Nullable

View File

@@ -0,0 +1,43 @@
package mc.protocol.packets.client;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.ToString;
import mc.protocol.State;
import mc.protocol.io.NetByteBuf;
import mc.protocol.packets.Packet;
/**
* Login start packet.
*
* <p>Начало авторизации.</p>
*
* <p>Структура пакета</p>
* <pre>
* | FIELD | TYPE | NOTES |
* |-------|--------|------------------|
* | Name | String | Имя/Логин игрока |
* </pre>
*
* @see <a href="https://wiki.vg/index.php?title=Protocol&oldid=7368#Login_Start" target="_top">Login start</a>
* @see State
*/
@NoArgsConstructor
@Getter
@EqualsAndHashCode
@ToString
public class LoginStartPacket implements Packet {
private String name;
@Override
public void readSelf(NetByteBuf netByteBuf) {
this.name = netByteBuf.readString();
}
@Override
public void writeSelf(NetByteBuf netByteBuf) {
netByteBuf.writeString(name);
}
}

View File

@@ -0,0 +1,47 @@
package mc.protocol.packets.server;
import lombok.Data;
import mc.protocol.State;
import mc.protocol.io.NetByteBuf;
import mc.protocol.packets.Packet;
/**
* Diconnect packet.
*
* <p>Отключение клиента сервером с указанием причины.</p>
*
* <p>Структура пакета</p>
* <pre>
* | FIELD | TYPE | NOTES |
* |--------|------|----------------------------------|
* | Reason | Text | Причина отключения. Опционально. |
* </pre>
*
* @see <a href="https://wiki.vg/index.php?title=Protocol&oldid=7368#Disconnect_2" target="_top">Disconnect</a>
* @see State
*/
@Data
public class DisconnectPacket implements Packet {
/**
* Причина отключения.
*
* <p>Пример:</p>
* <pre>
* {
* "text": "foo"
* }
* </pre>
*/
private String reason;
@Override
public void readSelf(NetByteBuf netByteBuf) {
this.reason = netByteBuf.readString();
}
@Override
public void writeSelf(NetByteBuf netByteBuf) {
netByteBuf.writeString(reason);
}
}

View File

@@ -16,9 +16,10 @@ import mc.protocol.io.codec.ProtocolDecoder;
import mc.protocol.io.codec.ProtocolEncoder; import mc.protocol.io.codec.ProtocolEncoder;
import mc.protocol.io.codec.ProtocolSplitter; import mc.protocol.io.codec.ProtocolSplitter;
import mc.server.network.Server; import mc.server.network.Server;
import mc.server.network.netty.HandshakeHandler; import mc.server.network.netty.handler.HandshakeHandler;
import mc.server.network.netty.NettyServer; import mc.server.network.netty.NettyServer;
import mc.server.network.netty.StatusHandler; import mc.server.network.netty.handler.LoginHandler;
import mc.server.network.netty.handler.StatusHandler;
import javax.inject.Provider; import javax.inject.Provider;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
@@ -56,14 +57,17 @@ public class NetworkModule {
} }
@Provides @Provides
Map<String, ChannelHandler> provideChannelHandlerMap(Provider<StatusHandler> statusHandlerProvider) { Map<String, ChannelHandler> provideChannelHandlerMap(
Provider<StatusHandler> statusHandlerProvider,
Provider<LoginHandler> loginHandlerProvider
) {
Map<String, ChannelHandler> map = new LinkedHashMap<>(); Map<String, ChannelHandler> map = new LinkedHashMap<>();
map.put("logger", new LoggingHandler(LogLevel.DEBUG)); map.put("logger", new LoggingHandler(LogLevel.DEBUG));
map.put("protocol_splitter", new ProtocolSplitter()); map.put("protocol_splitter", new ProtocolSplitter());
map.put("protocol_decoder", new ProtocolDecoder(true)); map.put("protocol_decoder", new ProtocolDecoder(true));
map.put("protocol_encoder", new ProtocolEncoder()); map.put("protocol_encoder", new ProtocolEncoder());
map.put("handshake_handler", new HandshakeHandler(statusHandlerProvider)); map.put("handshake_handler", new HandshakeHandler(statusHandlerProvider, loginHandlerProvider));
return map; return map;
} }
@@ -72,4 +76,9 @@ public class NetworkModule {
StatusHandler provideStatusHandler() { StatusHandler provideStatusHandler() {
return new StatusHandler(); return new StatusHandler();
} }
@Provides
LoginHandler provideLoginHandler() {
return new LoginHandler();
}
} }

View File

@@ -1,4 +1,4 @@
package mc.server.network.netty; package mc.server.network.netty.handler;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler; import io.netty.channel.SimpleChannelInboundHandler;

View File

@@ -1,9 +1,10 @@
package mc.server.network.netty; package mc.server.network.netty.handler;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import mc.protocol.NetworkAttributes; import mc.protocol.NetworkAttributes;
import mc.protocol.State;
import mc.protocol.packets.client.HandshakePacket; import mc.protocol.packets.client.HandshakePacket;
import javax.inject.Provider; import javax.inject.Provider;
@@ -13,12 +14,18 @@ import javax.inject.Provider;
public class HandshakeHandler extends AbstractPacketHandler<HandshakePacket> { public class HandshakeHandler extends AbstractPacketHandler<HandshakePacket> {
private final Provider<StatusHandler> statusHandlerProvider; private final Provider<StatusHandler> statusHandlerProvider;
private final Provider<LoginHandler> loginHandlerProvider;
@Override @Override
protected void channelRead1(ChannelHandlerContext ctx, HandshakePacket packet) { protected void channelRead1(ChannelHandlerContext ctx, HandshakePacket packet) {
log.info("{}", packet); log.info("{}", packet);
ctx.channel().attr(NetworkAttributes.STATE).set(packet.getNextState()); ctx.channel().attr(NetworkAttributes.STATE).set(packet.getNextState());
ctx.pipeline().replace("handshake_handler", "status_handler", statusHandlerProvider.get());
if (State.STATUS == packet.getNextState()) {
ctx.pipeline().replace("handshake_handler", "status_handler", statusHandlerProvider.get());
} else if (State.LOGIN == packet.getNextState()) {
ctx.channel().pipeline().replace("handshake_handler", "login_handler", loginHandlerProvider.get());
}
} }
} }

View File

@@ -0,0 +1,18 @@
package mc.server.network.netty.handler;
import io.netty.channel.ChannelHandlerContext;
import mc.protocol.packets.client.LoginStartPacket;
import mc.protocol.packets.server.DisconnectPacket;
public class LoginHandler extends AbstractPacketHandler<LoginStartPacket> {
@Override
protected void channelRead1(ChannelHandlerContext ctx, LoginStartPacket packet) {
DisconnectPacket disconnectPacket = new DisconnectPacket();
disconnectPacket.setReason("{\n" +
" \"text\": \"Server is not available.\"\n" +
"}");
ctx.channel().writeAndFlush(disconnectPacket).channel().disconnect();
}
}

View File

@@ -1,4 +1,4 @@
package mc.server.network.netty; package mc.server.network.netty.handler;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;