package com.asolutions.scmsshd.commands.filters.git; import java.util.regex.Pattern; import com.asolutions.scmsshd.commands.FilteredCommand; import com.asolutions.scmsshd.commands.filters.BadCommandException; import com.asolutions.scmsshd.commands.filters.IBadCommandFilter; public class GitBadCommandFilter implements IBadCommandFilter { // private static final Pattern commandFilter = Pattern.compile("^'/*(?P<path>[a-zA-Z0-9][a-zA-Z0-9@._-]*(/[a-zA-Z0-9][a-zA-Z0-9@._-]*)*)'$"); private static final String commandFilter = "^'.+'$"; private static final String[] validCommands = {"git-upload-pack", "git-receive-pack"}; private String[] parts; public GitBadCommandFilter() { } public FilteredCommand filterOrThrow(String command) throws BadCommandException { command = new GitCommandSeamer(command).toString(); checkForNewlines(command); parts = checkForOneArgument(command); throwIfContains(parts[1], ".."); throwIfContains(parts[1], "!"); checkAgainstPattern(parts[1]); checkValidCommands(parts[0]); parts[1] = parts[1].replaceAll("^'", ""); parts[1] = parts[1].replaceAll("'$", ""); return new FilteredCommand(parts[0], parts[1]); } private void checkValidCommands(String commandToCheck) throws BadCommandException { for (String validCommand : validCommands) { if (validCommand.equals(commandToCheck)){ return; } } throw new BadCommandException("Unknown Command: " + commandToCheck); } private void checkAgainstPattern(String command) throws BadCommandException { if (!Pattern.matches(commandFilter, command)) { throw new BadCommandException(); } } private String[] checkForOneArgument(String command) throws BadCommandException { String[] parts = command.split(" "); int count = parts.length; if (count == 1 || count > 2) { throw new BadCommandException("Invalid Number Of Arguments (must be 1): " + count); } return parts; } private void checkForNewlines(String command) throws BadCommandException { throwIfContains(command, "\n"); throwIfContains(command, "\r"); } private void throwIfContains(String command, String toCheckFor) throws BadCommandException { if (command.contains(toCheckFor)){ throw new BadCommandException("Cant Contain: " + toCheckFor); } } public String getCommand() { return parts[0]; } public String getArgument() { return parts[1]; } }