[vcs-log] properly escape filtered user names IDEA-141382 IDEA-141158 IDEA-121827

This commit is contained in:
Julia Beliaeva
2016-03-26 19:55:30 +03:00
parent 9d6142113e
commit c9fb5f5975
4 changed files with 14 additions and 15 deletions
@@ -15,16 +15,23 @@
*/
package com.intellij.vcs.log;
import com.intellij.openapi.util.text.StringUtil;
import com.intellij.util.Function;
import org.jetbrains.annotations.NotNull;
public class UserNameRegex implements Function<String, String> {
public static final UserNameRegex INSTANCE = new UserNameRegex();
@NotNull public static final UserNameRegex BASIC_INSTANCE = new UserNameRegex(false);
@NotNull public static final UserNameRegex EXTENDED_INSTANCE = new UserNameRegex(true);
@NotNull private static final char[] BASIC_REGEX_CHARS = new char[]{'.', '^', '$', '*', '[', ']'};
@NotNull public static final char[] EXTENDED_REGEX_CHARS = new char[]{'.', '^', '$', '*', '+', '-', '?', '(', ')', '[', ']', '{', '}', '|'};
private final boolean myExtended;
private UserNameRegex() {
private UserNameRegex(boolean extended) {
myExtended = extended;
}
@Override
public String fun(String s) {
return "^" + s + "$";
return "^" + StringUtil.escapeChars(StringUtil.escapeBackSlashes(s), myExtended ? EXTENDED_REGEX_CHARS : BASIC_REGEX_CHARS) + "$";
}
}
@@ -463,12 +463,7 @@ public class GitLogProvider implements VcsLogProvider {
if (filterCollection.getUserFilter() != null) {
String authorFilter =
StringUtil.join(ContainerUtil.map(filterCollection.getUserFilter().getUserNames(root), new Function<String, String>() {
@Override
public String fun(String s) {
return UserNameRegex.INSTANCE.fun(StringUtil.escapeBackSlashes(s));
}
}), "\\|");
StringUtil.join(ContainerUtil.map(filterCollection.getUserFilter().getUserNames(root), UserNameRegex.BASIC_INSTANCE), "\\|");
filterParameters.add(prepareParameter("author", authorFilter));
}
@@ -21,10 +21,7 @@ import com.intellij.util.ArrayUtil;
import com.intellij.util.Function;
import com.intellij.util.containers.ContainerUtil;
import com.intellij.util.containers.MultiMap;
import com.intellij.vcs.log.TimedVcsCommit;
import com.intellij.vcs.log.VcsLogObjectsFactory;
import com.intellij.vcs.log.VcsLogUserFilter;
import com.intellij.vcs.log.VcsUser;
import com.intellij.vcs.log.*;
import com.intellij.vcs.log.impl.VcsLogFilterCollectionImpl;
import com.intellij.vcs.log.ui.filter.VcsLogUserFilterImpl;
import git4idea.test.GitSingleRepoTest;
@@ -73,7 +70,7 @@ public class GitUserFilterTest extends GitSingleRepoTest {
public void testWeirdCharacters() throws Exception {
List<String> names = ContainerUtil.newArrayList();
for (Character c : new char[]{'.', '^', '$', '*', '+', '-', '?', '(', ')', '[', ']', '{', '}', '|'}) {
for (Character c : UserNameRegex.EXTENDED_REGEX_CHARS) {
String name = "user" + Character.toString(c) + "userovich";
names.add(name);
names.add(name + "@company.com");
@@ -222,7 +222,7 @@ public class HgLogProvider implements VcsLogProvider {
if (filterCollection.getUserFilter() != null) {
filterParameters.add("-r");
String authorFilter =
StringUtil.join(ContainerUtil.map(filterCollection.getUserFilter().getUserNames(root), UserNameRegex.INSTANCE), "|");
StringUtil.join(ContainerUtil.map(filterCollection.getUserFilter().getUserNames(root), UserNameRegex.EXTENDED_INSTANCE), "|");
filterParameters.add("user('re:" + authorFilter + "')");
}