geforkt von Mirrors/Velocity
Don't allow illegal characters (#580)
Dieser Commit ist enthalten in:
Ursprung
d619bb56fd
Commit
aa210b3544
@ -56,6 +56,7 @@ import com.velocitypowered.proxy.protocol.packet.TabCompleteResponse;
|
|||||||
import com.velocitypowered.proxy.protocol.packet.TabCompleteResponse.Offer;
|
import com.velocitypowered.proxy.protocol.packet.TabCompleteResponse.Offer;
|
||||||
import com.velocitypowered.proxy.protocol.packet.title.GenericTitlePacket;
|
import com.velocitypowered.proxy.protocol.packet.title.GenericTitlePacket;
|
||||||
import com.velocitypowered.proxy.protocol.util.PluginMessageUtil;
|
import com.velocitypowered.proxy.protocol.util.PluginMessageUtil;
|
||||||
|
import com.velocitypowered.proxy.util.CharacterUtil;
|
||||||
import io.netty.buffer.ByteBuf;
|
import io.netty.buffer.ByteBuf;
|
||||||
import io.netty.buffer.ByteBufUtil;
|
import io.netty.buffer.ByteBufUtil;
|
||||||
import io.netty.buffer.Unpooled;
|
import io.netty.buffer.Unpooled;
|
||||||
@ -153,6 +154,12 @@ public class ClientPlaySessionHandler implements MinecraftSessionHandler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
String msg = packet.getMessage();
|
String msg = packet.getMessage();
|
||||||
|
if (CharacterUtil.containsIllegalCharacters(msg)) {
|
||||||
|
player.disconnect(Component.translatable("velocity.error.illegal-chat-characters",
|
||||||
|
NamedTextColor.RED));
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
if (msg.startsWith("/")) {
|
if (msg.startsWith("/")) {
|
||||||
String originalCommand = msg.substring(1);
|
String originalCommand = msg.substring(1);
|
||||||
server.getCommandManager().callCommandEvent(player, msg.substring(1))
|
server.getCommandManager().callCommandEvent(player, msg.substring(1))
|
||||||
@ -629,4 +636,5 @@ public class ClientPlaySessionHandler implements MinecraftSessionHandler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1,48 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 Velocity Contributors
|
||||||
|
*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.velocitypowered.proxy.util;
|
||||||
|
|
||||||
|
public final class CharacterUtil {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Checks if a character is allowed.
|
||||||
|
* @param c character to check
|
||||||
|
* @return true if the character is allowed
|
||||||
|
*/
|
||||||
|
public static boolean isAllowedCharacter(char c) {
|
||||||
|
// 167 = §, 127 = DEL
|
||||||
|
// https://minecraft.fandom.com/wiki/Multiplayer#Chat
|
||||||
|
return c != 167 && c >= ' ' && c != 127;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* It is not possible to send certain characters in the chat like:
|
||||||
|
* section symbol, DEL, and all characters below space.
|
||||||
|
* Checks if a message contains illegal characters.
|
||||||
|
* @param message the message to check
|
||||||
|
* @return true if the message contains illegal characters
|
||||||
|
*/
|
||||||
|
public static boolean containsIllegalCharacters(String message) {
|
||||||
|
for (int i = 0; i < message.length(); i++) {
|
||||||
|
if (!isAllowedCharacter(message.charAt(i))) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
@ -29,6 +29,7 @@ velocity.error.modern-forwarding-needs-new-client=This server is only compatible
|
|||||||
velocity.error.modern-forwarding-failed=Your server did not send a forwarding request to the proxy. Make sure the server is configured for Velocity forwarding.
|
velocity.error.modern-forwarding-failed=Your server did not send a forwarding request to the proxy. Make sure the server is configured for Velocity forwarding.
|
||||||
velocity.error.moved-to-new-server=You were kicked from {0}: {1}
|
velocity.error.moved-to-new-server=You were kicked from {0}: {1}
|
||||||
velocity.error.no-available-servers=There are no available servers to connect you to. Try again later or contact an admin.
|
velocity.error.no-available-servers=There are no available servers to connect you to. Try again later or contact an admin.
|
||||||
|
velocity.error.illegal-chat-characters=Illegal characters in chat
|
||||||
|
|
||||||
# Commands
|
# Commands
|
||||||
velocity.command.generic-error=An error occurred while running this command.
|
velocity.command.generic-error=An error occurred while running this command.
|
||||||
|
@ -0,0 +1,52 @@
|
|||||||
|
/*
|
||||||
|
* Copyright (C) 2018 Velocity Contributors
|
||||||
|
*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
package com.velocitypowered.proxy.util;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
class CharacterUtilTest {
|
||||||
|
|
||||||
|
private static final String CHARACTERS = "!\\\"#$%&'()*+,-./0123456789:;<=>?"
|
||||||
|
+ "@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\\\]^_'abcdefghijklmnopqrstuvwxyz¡«»";
|
||||||
|
private static final String NON_ASCII_CHARACTERS = "速度ъगꯀ▀";
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testCharacter() {
|
||||||
|
assertTrue(CharacterUtil.isAllowedCharacter('a'));
|
||||||
|
assertTrue(CharacterUtil.isAllowedCharacter(' '));
|
||||||
|
|
||||||
|
assertFalse(CharacterUtil.isAllowedCharacter('\u00A7')); // §
|
||||||
|
assertFalse(CharacterUtil.isAllowedCharacter('\u007F')); // DEL
|
||||||
|
assertFalse(CharacterUtil.isAllowedCharacter((char) 0));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testMessage() {
|
||||||
|
assertFalse(CharacterUtil.containsIllegalCharacters(""));
|
||||||
|
assertFalse(CharacterUtil.containsIllegalCharacters(" "));
|
||||||
|
assertFalse(CharacterUtil.containsIllegalCharacters("Velocity"));
|
||||||
|
assertFalse(CharacterUtil.containsIllegalCharacters(CHARACTERS));
|
||||||
|
assertFalse(CharacterUtil.containsIllegalCharacters(NON_ASCII_CHARACTERS));
|
||||||
|
|
||||||
|
assertTrue(CharacterUtil.containsIllegalCharacters("§cVelocity"));
|
||||||
|
assertTrue(CharacterUtil.containsIllegalCharacters("§"));
|
||||||
|
}
|
||||||
|
}
|
Laden…
In neuem Issue referenzieren
Einen Benutzer sperren