diff --git a/Documentation/config-gerrit.txt b/Documentation/config-gerrit.txt index f02d89ac2c..879ec9937c 100644 --- a/Documentation/config-gerrit.txt +++ b/Documentation/config-gerrit.txt @@ -4423,19 +4423,25 @@ Defaults to false. [[receiveemail.filter.mode]]receiveemail.filter.mode:: + -A black- and whitelist filter to filter incoming emails. +An allow and block filter to filter incoming emails. + If `OFF`, emails are not filtered by the list filter. + -If `WHITELIST`, only emails where a pattern from +If `ALLOW`, only emails where a pattern from <> matches 'From' will be processed. + -If `BLACKLIST`, only emails where no pattern from +If `BLOCK`, only emails where no pattern from <> matches 'From' will be processed. + Defaults to `OFF`. ++ +The previous filter-names 'BLACKLIST' and 'WHITELIST' have been deprecated +since they may be considered disrespectful and there's no technical or +practical reason to use these exact terms for the filters. +For backwards compatibility they are still supported but support for these +deprecated terms will be removed in future releases. [[receiveemail.filter.patterns]]receiveemail.filter.patterns:: + @@ -4566,9 +4572,10 @@ Password for the account named by sendemail.smtpUser. [[sendemail.allowrcpt]]sendemail.allowrcpt:: + -If present, each value adds one entry to the whitelist of email -addresses that Gerrit can send email to. If set to a complete -email address, that one address is added to the white list. +If present, each value adds one entry to the list of allowed email +addresses that Gerrit can send emails to. If set to a complete +email address, that one address is added to the list of allowed +emails. If set to a domain name, any address at that domain can receive email from Gerrit. + @@ -4579,9 +4586,10 @@ By default, unset, permitting delivery to any email address. [[sendemail.denyrcpt]]sendemail.denyrcpt:: + -If present, each value adds one entry to the blacklist of email -addresses that Gerrit can send email to. If set to a complete -email address, that one address is added to the blacklist. +If present, each value adds one entry to the list of email +addresses that Gerrit can't send emails to. If set to a complete +email address, that one address is added to the list of blocked +emails. If set to a domain name, any address at that domain can *not* receive email from Gerrit. + diff --git a/java/com/google/gerrit/mail/HtmlParser.java b/java/com/google/gerrit/mail/HtmlParser.java index 2fc659d92f..ba73bdd29f 100644 --- a/java/com/google/gerrit/mail/HtmlParser.java +++ b/java/com/google/gerrit/mail/HtmlParser.java @@ -35,7 +35,7 @@ public class HtmlParser { "gmail_quote" // Used for quoting original content ); - private static final ImmutableSet WHITELISTED_HTML_TAGS = + private static final ImmutableSet ALLOWED_HTML_TAGS = ImmutableSet.of( "div", // Most user-typed comments are contained in a
tag "a", // We allow links to be contained in a comment @@ -120,8 +120,8 @@ public class HtmlParser { // There is no user-input in quoted text continue; } - if (!WHITELISTED_HTML_TAGS.contains(elementName)) { - // We only accept a set of whitelisted tags that can contain user input + if (!ALLOWED_HTML_TAGS.contains(elementName)) { + // We only accept a set of allowed tags that can contain user input continue; } if (elementName.equals("a") && e.attr("href").startsWith("mailto:")) { diff --git a/java/com/google/gerrit/server/mail/ListMailFilter.java b/java/com/google/gerrit/server/mail/ListMailFilter.java index 23f7e12c16..67cef458bd 100644 --- a/java/com/google/gerrit/server/mail/ListMailFilter.java +++ b/java/com/google/gerrit/server/mail/ListMailFilter.java @@ -31,8 +31,8 @@ public class ListMailFilter implements MailFilter { public enum ListFilterMode { OFF, - WHITELIST, - BLACKLIST + ALLOW, + BLOCK } private final ListFilterMode mode; @@ -40,12 +40,37 @@ public class ListMailFilter implements MailFilter { @Inject ListMailFilter(@GerritServerConfig Config cfg) { - this.mode = cfg.getEnum("receiveemail", "filter", "mode", ListFilterMode.OFF); + mode = getListFilterMode(cfg); String[] addresses = cfg.getStringList("receiveemail", "filter", "patterns"); String concat = Arrays.asList(addresses).stream().collect(joining("|")); this.mailPattern = Pattern.compile(concat); } + private static final String LEGACY_ALLOW = "WHITELIST"; + private static final String LEGACY_BLOCK = "BLACKLIST"; + + /** Legacy names are supported, but should be removed in the future. */ + private ListFilterMode getListFilterMode(Config cfg) { + ListFilterMode mode; + String modeString = cfg.getString("receiveemail", "filter", "mode"); + if (modeString == null) { + modeString = ""; + } + switch (modeString) { + case LEGACY_ALLOW: + case "ALLOW": + mode = ListFilterMode.ALLOW; + break; + case LEGACY_BLOCK: + case "BLOCK": + mode = ListFilterMode.BLOCK; + break; + default: + mode = ListFilterMode.OFF; + } + return mode; + } + @Override public boolean shouldProcessMessage(MailMessage message) { if (mode == ListFilterMode.OFF) { @@ -53,8 +78,7 @@ public class ListMailFilter implements MailFilter { } boolean match = mailPattern.matcher(message.from().email()).find(); - if ((mode == ListFilterMode.WHITELIST && !match) - || (mode == ListFilterMode.BLACKLIST && match)) { + if ((mode == ListFilterMode.ALLOW && !match) || (mode == ListFilterMode.BLOCK && match)) { logger.atInfo().log("Mail message from %s rejected by list filter", message.from()); return false; } diff --git a/javatests/com/google/gerrit/acceptance/server/mail/ListMailFilterIT.java b/javatests/com/google/gerrit/acceptance/server/mail/ListMailFilterIT.java index e961c679d1..49b184b6a5 100644 --- a/javatests/com/google/gerrit/acceptance/server/mail/ListMailFilterIT.java +++ b/javatests/com/google/gerrit/acceptance/server/mail/ListMailFilterIT.java @@ -45,11 +45,11 @@ public class ListMailFilterIT extends AbstractMailIT { } @Test - @GerritConfig(name = "receiveemail.filter.mode", value = "WHITELIST") + @GerritConfig(name = "receiveemail.filter.mode", value = "ALLOW") @GerritConfig( name = "receiveemail.filter.patterns", values = {".+ser@example\\.com", "a@b\\.com"}) - public void listFilterWhitelistDoesNotFilterListedUser() throws Exception { + public void listFilterAllowDoesNotFilterListedUser() throws Exception { ChangeInfo changeInfo = createChangeAndReplyByEmail(); // Check that the comments from the email have been persisted Collection messages = gApi.changes().id(changeInfo.id).get().messages; @@ -57,11 +57,11 @@ public class ListMailFilterIT extends AbstractMailIT { } @Test - @GerritConfig(name = "receiveemail.filter.mode", value = "WHITELIST") + @GerritConfig(name = "receiveemail.filter.mode", value = "ALLOW") @GerritConfig( name = "receiveemail.filter.patterns", values = {".+@gerritcodereview\\.com", "a@b\\.com"}) - public void listFilterWhitelistFiltersNotListedUser() throws Exception { + public void listFilterAllowFiltersNotListedUser() throws Exception { ChangeInfo changeInfo = createChangeAndReplyByEmail(); // Check that the comments from the email have NOT been persisted Collection messages = gApi.changes().id(changeInfo.id).get().messages; @@ -72,11 +72,11 @@ public class ListMailFilterIT extends AbstractMailIT { } @Test - @GerritConfig(name = "receiveemail.filter.mode", value = "BLACKLIST") + @GerritConfig(name = "receiveemail.filter.mode", value = "BLOCK") @GerritConfig( name = "receiveemail.filter.patterns", values = {".+@gerritcodereview\\.com", "a@b\\.com"}) - public void listFilterBlacklistDoesNotFilterNotListedUser() throws Exception { + public void listFilterBlockDoesNotFilterNotListedUser() throws Exception { ChangeInfo changeInfo = createChangeAndReplyByEmail(); // Check that the comments from the email have been persisted Collection messages = gApi.changes().id(changeInfo.id).get().messages; @@ -84,11 +84,11 @@ public class ListMailFilterIT extends AbstractMailIT { } @Test - @GerritConfig(name = "receiveemail.filter.mode", value = "BLACKLIST") + @GerritConfig(name = "receiveemail.filter.mode", value = "BLOCK") @GerritConfig( name = "receiveemail.filter.patterns", values = {".+@example\\.com", "a@b\\.com"}) - public void listFilterBlacklistFiltersListedUser() throws Exception { + public void listFilterBlockFiltersListedUser() throws Exception { ChangeInfo changeInfo = createChangeAndReplyByEmail(); // Check that the comments from the email have been persisted Collection messages = gApi.changes().id(changeInfo.id).get().messages;