Skip to content

Commit

Permalink
Verify parameter count in command handlers
Browse files Browse the repository at this point in the history
  • Loading branch information
MCMrARM committed Nov 30, 2017
1 parent 74be4ca commit bf243a2
Show file tree
Hide file tree
Showing 18 changed files with 97 additions and 58 deletions.
16 changes: 16 additions & 0 deletions chatlib/src/main/java/io/mrarm/chatlib/irc/CommandHandler.java
Expand Up @@ -13,6 +13,22 @@ static int toNumeric(String s) {
}
}

static String getParamWithCheck(List<String> params, int index) throws InvalidMessageException {
if (index < 0 || index >= params.size())
throw new InvalidMessageException("Missing parameter");
return params.get(index);
}

static String getParamOrDefault(List<String> params, int index, String def) {
if (index < 0 || index >= params.size())
return def;
return params.get(index);
}

static String getParamOrNull(List<String> params, int index) {
return getParamOrDefault(params, index, null);
}

Object[] getHandledCommands();

void handle(ServerConnectionData connection, MessagePrefix sender, String command, List<String> params,
Expand Down
Expand Up @@ -2,6 +2,7 @@

import io.mrarm.chatlib.dto.BatchInfo;
import io.mrarm.chatlib.dto.MessageInfo;
import io.mrarm.chatlib.irc.CommandHandler;
import io.mrarm.chatlib.irc.InvalidMessageException;
import io.mrarm.chatlib.irc.MessagePrefix;
import io.mrarm.chatlib.irc.ServerConnectionData;
Expand Down Expand Up @@ -42,10 +43,10 @@ public void processMessage(MessageInfo.Builder message, Map<String, String> tags
@Override
public void handle(ServerConnectionData connection, MessagePrefix sender, String command, List<String> params,
Map<String, String> tags) throws InvalidMessageException {
String name = params.get(0);
String name = CommandHandler.getParamWithCheck(params, 0);
if (name.startsWith("+")) {
name = name.substring(1);
BatchInfo batch = new BatchInfo(UUID.randomUUID(), params.get(1),
BatchInfo batch = new BatchInfo(UUID.randomUUID(), CommandHandler.getParamWithCheck(params, 1),
params.subList(1, params.size()).toArray(new String[params.size() - 1]), getBatchForTags(tags));
batches.put(name, batch);
if (batchListeners.containsKey(batch.getType())) {
Expand Down
Expand Up @@ -51,7 +51,7 @@ public void handle(ServerConnectionData connection, MessagePrefix sender, String
Map<String, String> tags) throws InvalidMessageException {
int numeric = CommandHandler.toNumeric(command);
if (command.equals(CMD_AUTHENTICATE)) {
if (params.size() == 1 && params.get(0).equals("+"))
if (params.size() == 1 && CommandHandler.getParamWithCheck(params, 0).equals("+"))
continueAuthentication(connection);
} else if (numeric == RPL_SASLSUCCESS) {
if (finishLock != -1) {
Expand Down
Expand Up @@ -20,7 +20,7 @@ public Object[] getHandledCommands() {
@Override
public void handle(ServerConnectionData connection, MessagePrefix sender, String command, List<String> params,
Map<String, String> tags) throws InvalidMessageException {
String nick = params.get(1);
String nick = CommandHandler.getParamWithCheck(params, 1);
String message = params.get(params.size() - 1);
WhoisCommandHandler whoisHandler = connection.getCommandHandlerList().getHandler(WhoisCommandHandler.class);
if (whoisHandler != null)
Expand Down
@@ -1,9 +1,6 @@
package io.mrarm.chatlib.irc.handlers;

import io.mrarm.chatlib.irc.CommandDisconnectHandler;
import io.mrarm.chatlib.irc.InvalidMessageException;
import io.mrarm.chatlib.irc.MessagePrefix;
import io.mrarm.chatlib.irc.ServerConnectionData;
import io.mrarm.chatlib.irc.*;
import io.mrarm.chatlib.irc.cap.CapabilityEntryPair;

import java.util.ArrayList;
Expand All @@ -26,16 +23,16 @@ public void handle(ServerConnectionData connection, MessagePrefix sender, String
Map<String, String> tags)
throws InvalidMessageException {
int baseSubcmdI = 1;
String subcmd = params.get(baseSubcmdI);
String subcmd = CommandHandler.getParamWithCheck(params, baseSubcmdI);
boolean expectMore = false;
if (subcmd.equals("*")) {
expectMore = true;
subcmd = params.get(++baseSubcmdI);
subcmd = CommandHandler.getParamWithCheck(params, ++baseSubcmdI);
}
if (subcmd.equals("LS")) {
if (lsEntries == null)
lsEntries = new ArrayList<>();
for (String s : params.get(baseSubcmdI + 1).split(" "))
for (String s : CommandHandler.getParamWithCheck(params, baseSubcmdI + 1).split(" "))
lsEntries.add(new CapabilityEntryPair(s));
if (!expectMore) {
connection.getCapabilityManager().onServerCapabilityList(lsEntries);
Expand All @@ -44,20 +41,20 @@ public void handle(ServerConnectionData connection, MessagePrefix sender, String
} else if (subcmd.equals("ACK")) {
if (ackEntries == null)
ackEntries = new ArrayList<>();
for (String s : params.get(baseSubcmdI + 1).split(" "))
for (String s : CommandHandler.getParamWithCheck(params, baseSubcmdI + 1).split(" "))
ackEntries.add(s);
if (!expectMore) {
connection.getCapabilityManager().onCapabilitiesAck(ackEntries);
ackEntries = null;
}
} else if (subcmd.equals("NEW")) {
List<CapabilityEntryPair> entries = new ArrayList<>();
for (String s : params.get(baseSubcmdI + 1).split(" "))
for (String s : CommandHandler.getParamWithCheck(params, baseSubcmdI + 1).split(" "))
entries.add(new CapabilityEntryPair(s));
connection.getCapabilityManager().onNewServerCapabilitiesAvailable(entries);
} else if (subcmd.equals("DEL")) {
List<String> entries = new ArrayList<>();
Collections.addAll(entries, params.get(baseSubcmdI + 1).split(" "));
Collections.addAll(entries, CommandHandler.getParamWithCheck(params, baseSubcmdI + 1).split(" "));
connection.getCapabilityManager().onServerCapabilitiesRemoved(entries);
} else {
throw new InvalidMessageException("Unknown subcommand: " + subcmd);
Expand Down
Expand Up @@ -21,16 +21,17 @@ public Object[] getHandledCommands() {
public void handle(ServerConnectionData connection, MessagePrefix sender, String command, List<String> params,
Map<String, String> tags)
throws InvalidMessageException {
String[] channels = CommandHandler.getParamWithCheck(params, 0).split(",");
if (sender.getNick().equals(connection.getUserNick())) {
for (String channel : params.get(0).split(","))
for (String channel : channels)
connection.onChannelJoined(channel);
}
try {
UUID userUUID = connection.getUserInfoApi().resolveUser(sender.getNick(), sender.getUser(),
sender.getHost(), null, null).get();
MessageSenderInfo senderInfo = new MessageSenderInfo(sender.getNick(), sender.getUser(), sender.getHost(),
null, userUUID);
for (String channel : params.get(0).split(",")) {
for (String channel : channels) {
ChannelData channelData = connection.getJoinedChannelData(channel);
channelData.addMember(new ChannelData.Member(userUUID, null, null));
channelData.addMessage(new MessageInfo.Builder(senderInfo, null, MessageInfo.MessageType.JOIN), tags);
Expand Down
Expand Up @@ -45,7 +45,14 @@ public void handle(ServerConnectionData connection, MessagePrefix sender, String
} else if (numeric == RPL_LIST) {
if (request.entries == null)
throw new InvalidMessageException("Channel list entry without a list start message");
ChannelList.Entry entry = new ChannelList.Entry(params.get(1), Integer.parseInt(params.get(2)), params.get(3));
ChannelList.Entry entry;
try {
entry = new ChannelList.Entry(CommandHandler.getParamWithCheck(params, 1),
Integer.parseInt(CommandHandler.getParamWithCheck(params, 2)),
CommandHandler.getParamWithCheck(params, 3));
} catch (NumberFormatException e) {
throw new InvalidMessageException();
}
request.entries.add(entry);
if (request.entryCallback != null)
request.entryCallback.onResponse(entry);
Expand Down
Expand Up @@ -41,9 +41,9 @@ public void handle(ServerConnectionData connection, MessagePrefix sender, String
if (sender != null)
userUUID = connection.getUserInfoApi().resolveUser(sender.getNick(), sender.getUser(), sender.getHost(),
null, null).get();
String[] targetChannels = params.get(0).split(",");
String[] targetChannels = CommandHandler.getParamWithCheck(params, 0).split(",");

String text = params.get(1);
String text = CommandHandler.getParamWithCheck(params, 1);
if (text.indexOf('\20') != -1)
text = lowDequote(text);
int ctcpS = text.indexOf('\01');
Expand All @@ -64,8 +64,7 @@ public void handle(ServerConnectionData connection, MessagePrefix sender, String
}
if (sender == null || (channelData == null && sender.getUser() == null && sender.getHost() == null)) {
connection.getServerStatusData().addMessage(new StatusMessageInfo(sender != null ?
sender.getServerName() : null, new Date(), StatusMessageInfo.MessageType.NOTICE,
params.get(1)));
sender.getServerName() : null, new Date(), StatusMessageInfo.MessageType.NOTICE, text));
continue;
}

Expand Down
Expand Up @@ -27,7 +27,7 @@ public void handle(ServerConnectionData connection, MessagePrefix sender, String
UUID userUUID = connection.getUserInfoApi().resolveUser(sender.getNick(), sender.getUser(),
sender.getHost(), null, null).get();

String target = params.get(0);
String target = CommandHandler.getParamWithCheck(params, 0);
boolean isChannelTarget = connection.getSupportList().getSupportedChannelTypes().contains(target.charAt(0));
if (isChannelTarget) {
ChannelData channelData = connection.getJoinedChannelData(target);
Expand All @@ -46,7 +46,7 @@ public void handle(ServerConnectionData connection, MessagePrefix sender, String
private void handleChannelModes(ServerConnectionData connection, MessageSenderInfo senderInfo,
ChannelData channelData, List<String> params, Map<String, String> tags) throws InvalidMessageException {
int argIndex = 1;
String modes = params.get(argIndex++);
String modes = CommandHandler.getParamWithCheck(params, argIndex++);
List<ChannelModeMessageInfo.Entry> log = new ArrayList<>();
boolean add = true;
for (int i = 0; i < modes.length(); i++) {
Expand All @@ -56,7 +56,7 @@ private void handleChannelModes(ServerConnectionData connection, MessageSenderIn
} else if (c == '-') {
add = false;
} else if (connection.getSupportList().getSupportedNickPrefixModes().contains(c)) {
String nick = params.get(argIndex++);
String nick = CommandHandler.getParamWithCheck(params, argIndex++);
ChannelData.Member member = getUser(connection, channelData, nick);
char prefix = connection.getSupportList().getSupportedNickPrefixes().get(
connection.getSupportList().getSupportedNickPrefixModes().find(c));
Expand All @@ -72,21 +72,21 @@ private void handleChannelModes(ServerConnectionData connection, MessageSenderIn
channelData.setFlagMode(c, add);
log.add(new ChannelModeMessageInfo.Entry(ChannelModeMessageInfo.EntryType.FLAG, c, null, !add));
} else if (connection.getSupportList().getSupportedListChannelModes().contains(c)) {
String p = params.get(argIndex++);
String p = CommandHandler.getParamWithCheck(params, argIndex++);
if (add)
channelData.addListMode(c, p);
else
channelData.removeListMode(c, p);
log.add(new ChannelModeMessageInfo.Entry(ChannelModeMessageInfo.EntryType.LIST, c, p, !add));
} else if (connection.getSupportList().getSupportedValueExactUnsetChannelModes().contains(c)) {
String p = params.get(argIndex++);
String p = CommandHandler.getParamWithCheck(params, argIndex++);
if (add)
channelData.setValueExactUnsetMode(c, p);
else
channelData.removeValueExactUnsetMode(c);
log.add(new ChannelModeMessageInfo.Entry(ChannelModeMessageInfo.EntryType.VALUE_EXACT_UNSET, c, p, !add));
} else if (connection.getSupportList().getSupportedValueChannelModes().contains(c)) {
String p = (add ? params.get(argIndex++) : null);
String p = (add ? CommandHandler.getParamWithCheck(params, argIndex++) : null);
if (add)
channelData.setValueMode(c, p);
else
Expand Down
Expand Up @@ -28,18 +28,24 @@ public void handle(ServerConnectionData connection, MessagePrefix sender, String
int numeric = CommandHandler.toNumeric(command);
switch (numeric) {
case RPL_MOTDSTART:
motdBuilder = new StringBuilder(params.get(1));
motdBuilder = new StringBuilder(CommandHandler.getParamWithCheck(params, 1));
motdBuilder.append('\n');
break;
case RPL_MOTD:
motdBuilder.append(params.get(1));
if (motdBuilder == null)
throw new InvalidMessageException();
motdBuilder.append(CommandHandler.getParamWithCheck(params, 1));
motdBuilder.append('\n');
break;
case ERR_NOMOTD:
case RPL_ENDOFMOTD: {
if (numeric != ERR_NOMOTD)
motdBuilder.append(params.get(1));
String motd = (numeric == ERR_NOMOTD ? params.get(1) : motdBuilder.toString());
if (numeric != ERR_NOMOTD) {
if (motdBuilder == null)
throw new InvalidMessageException();
motdBuilder.append(CommandHandler.getParamWithCheck(params, 1));
}
String motd = (numeric == ERR_NOMOTD ? CommandHandler.getParamWithCheck(params, 1)
: motdBuilder.toString());
connection.getServerStatusData().setMotd(motd);
connection.getServerStatusData().addMessage(new StatusMessageInfo(sender.getServerName(), new Date(),
StatusMessageInfo.MessageType.MOTD, motd));
Expand Down
Expand Up @@ -26,12 +26,12 @@ public void handle(ServerConnectionData connection, MessagePrefix sender, String
int numeric = CommandHandler.toNumeric(command);
if (numeric == RPL_NAMREPLY) {
int paramId = 1;
String channelName = params.get(paramId);
String channelName = CommandHandler.getParamWithCheck(params, paramId);
// if the first argument is '=' or '*' or '@', skip it as it's the channel type which we don't really care
// about for now
if (channelName.length() == 1 && (channelName.charAt(0) == '=' || channelName.charAt(0) == '*' ||
channelName.charAt(0) == '@'))
channelName = params.get(++paramId);
channelName = CommandHandler.getParamWithCheck(params, ++paramId);

List<ChannelData.Member> list = channelNamesList.get(channelName);
if (list == null) {
Expand All @@ -40,7 +40,7 @@ public void handle(ServerConnectionData connection, MessagePrefix sender, String
}
List<NickWithPrefix> nicksWithPrefixes = new ArrayList<>();
List<String> uuidRequestList = new ArrayList<>();
for (String rawNick : params.get(++paramId).split(" ")) {
for (String rawNick : CommandHandler.getParamWithCheck(params, ++paramId).split(" ")) {
NickWithPrefix nickWithPrefix = connection.getNickPrefixParser().parse(connection, rawNick);
nicksWithPrefixes.add(nickWithPrefix);
uuidRequestList.add(nickWithPrefix.getNick());
Expand All @@ -67,7 +67,7 @@ public void handle(ServerConnectionData connection, MessagePrefix sender, String
: null, nickWithPrefix.getNickPrefixes()));
}
} else if (numeric == RPL_ENDOFNAMES) {
String channelName = params.get(1);
String channelName = CommandHandler.getParamWithCheck(params, 1);
try {
connection.getJoinedChannelData(channelName).setMembers(channelNamesList.containsKey(channelName)
? channelNamesList.get(channelName) : new ArrayList<>());
Expand Down
Expand Up @@ -32,7 +32,7 @@ public int[] getHandledErrors() {
public void handle(ServerConnectionData connection, MessagePrefix sender, String command, List<String> params,
Map<String, String> tags)
throws InvalidMessageException {
String newNick = params.get(0);
String newNick = CommandHandler.getParamWithCheck(params, 0);
if (sender.getNick().equals(connection.getUserNick())) {
connection.setUserNick(newNick);
onResponse(newNick, newNick);
Expand All @@ -42,8 +42,8 @@ public void handle(ServerConnectionData connection, MessagePrefix sender, String
sender.getHost(), null, null).get();
MessageSenderInfo senderInfo = new MessageSenderInfo(sender.getNick(), sender.getUser(), sender.getHost(),
null, userInfo.getUUID());
connection.getUserInfoApi().setUserNick(userInfo.getUUID(), params.get(0), null, null)
.get();
connection.getUserInfoApi().setUserNick(userInfo.getUUID(),
CommandHandler.getParamWithCheck(params, 0), null, null).get();
for (String channel : userInfo.getChannels()) {
try {
ChannelData channelData = connection.getJoinedChannelData(channel);
Expand Down
Expand Up @@ -21,17 +21,18 @@ public Object[] getHandledCommands() {
public void handle(ServerConnectionData connection, MessagePrefix sender, String command, List<String> params,
Map<String, String> tags)
throws InvalidMessageException {
String[] channels = CommandHandler.getParamWithCheck(params, 0).split(",");
if (sender.getNick().equals(connection.getUserNick())) {
for (String channel : params.get(0).split(","))
for (String channel : channels)
connection.onChannelLeft(channel);
}
try {
UUID userUUID = connection.getUserInfoApi().resolveUser(sender.getNick(), sender.getUser(),
sender.getHost(), null, null).get();
MessageSenderInfo senderInfo = new MessageSenderInfo(sender.getNick(), sender.getUser(), sender.getHost(),
null, userUUID);
String message = params.size() > 1 ? params.get(1) : null;
for (String channel : params.get(0).split(",")) {
String message = CommandHandler.getParamOrNull(params, 1);
for (String channel : channels) {
ChannelData channelData = connection.getJoinedChannelData(channel);
ChannelData.Member member = channelData.getMember(userUUID);
if (member != null)
Expand Down
Expand Up @@ -21,7 +21,8 @@ public void handle(ServerConnectionData connection, MessagePrefix sender, String
Map<String, String> tags)
throws InvalidMessageException {
try {
connection.getApi().sendCommand("PONG", true, params.get(0));
connection.getApi().sendCommand("PONG", true,
CommandHandler.getParamWithCheck(params, 0));
} catch (IOException ignored) {
}
}
Expand Down

0 comments on commit bf243a2

Please sign in to comment.