JAMES-2501 Create a SpamAssassin backend project
Project: http://git-wip-us.apache.org/repos/asf/james-project/repo Commit: http://git-wip-us.apache.org/repos/asf/james-project/commit/1fd63a7f Tree: http://git-wip-us.apache.org/repos/asf/james-project/tree/1fd63a7f Diff: http://git-wip-us.apache.org/repos/asf/james-project/diff/1fd63a7f Branch: refs/heads/master Commit: 1fd63a7fb42283549ff987ad5fd9deb6136400fe Parents: a80003a Author: benwa <btell...@linagora.com> Authored: Thu Jul 26 11:31:53 2018 +0700 Committer: benwa <btell...@linagora.com> Committed: Tue Jul 31 09:24:17 2018 +0700 ---------------------------------------------------------------------- mailbox/plugin/spamassassin/pom.xml | 10 + .../mailbox/spamassassin/SpamAssassin.java | 2 +- mailbox/store/pom.xml | 4 + pom.xml | 12 + server/container/util/pom.xml | 23 - .../james/util/scanner/SpamAssassinInvoker.java | 251 ----------- .../james/util/scanner/SpamAssassinResult.java | 109 ----- .../util/scanner/SpamAssassinExtension.java | 148 ------- .../util/scanner/SpamAssassinInvokerTest.java | 147 ------- .../util/scanner/SpamAssassinResultTest.java | 96 ----- .../util/scanner/SpamAssassinWaitStrategy.java | 67 --- .../resources/docker/spamassassin/Dockerfile | 43 -- .../resources/docker/spamassassin/bayes_pg.sql | 119 ------ .../test/resources/docker/spamassassin/local.cf | 97 ----- .../docker/spamassassin/rule-update.sh | 7 - .../test/resources/docker/spamassassin/run.sh | 9 - .../test/resources/docker/spamassassin/spamd.sh | 15 - .../util/src/test/resources/eml/spam.eml | 152 ------- .../src/test/resources/spamassassin_db/ham/ham1 | 113 ----- .../src/test/resources/spamassassin_db/ham/ham2 | 73 ---- .../src/test/resources/spamassassin_db/ham/ham3 | 82 ---- .../src/test/resources/spamassassin_db/ham/ham4 | 78 ---- .../src/test/resources/spamassassin_db/ham/ham5 | 77 ---- .../src/test/resources/spamassassin_db/ham/ham6 | 74 ---- .../src/test/resources/spamassassin_db/ham/ham7 | 88 ---- .../src/test/resources/spamassassin_db/ham/ham8 | 85 ---- .../src/test/resources/spamassassin_db/ham/ham9 | 176 -------- .../test/resources/spamassassin_db/spam/spam1 | 108 ----- .../test/resources/spamassassin_db/spam/spam2 | 186 -------- .../test/resources/spamassassin_db/spam/spam3 | 211 --------- .../test/resources/spamassassin_db/spam/spam4 | 213 ---------- .../test/resources/spamassassin_db/spam/spam5 | 161 ------- .../test/resources/spamassassin_db/spam/spam6 | 423 ------------------- .../test/resources/spamassassin_db/spam/spam7 | 71 ---- .../test/resources/spamassassin_db/spam/spam8 | 321 -------------- .../test/resources/spamassassin_db/spam/spam9 | 142 ------- .../transport/mailets/SpamAssassinTest.java | 2 +- server/mailet/mailets/pom.xml | 10 + .../james/transport/mailets/SpamAssassin.java | 4 +- .../transport/matchers/IsMarkedAsSpam.java | 2 +- .../transport/mailets/SpamAssassinTest.java | 6 +- .../cassandra-jmap-integration-testing/pom.xml | 6 + .../jmap/cassandra/CassandraJmapExtension.java | 2 +- .../jmap-integration-testing-common/pom.xml | 6 + .../integration/JamesWithSpamAssassin.java | 2 +- .../methods/integration/SpamAssassinModule.java | 4 +- .../memory-jmap-integration-testing/pom.xml | 6 + .../james/jmap/memory/MemoryJmapExtension.java | 2 +- server/protocols/protocols-smtp/pom.xml | 10 + .../fastfail/SpamAssassinHandler.java | 4 +- .../smtpserver/SpamAssassinHandlerTest.java | 6 +- .../java/org/apache/james/utils/MockSpamd.java | 101 ----- .../apache/james/utils/MockSpamdTestRule.java | 46 -- third-party/pom.xml | 40 ++ third-party/spamassassin/pom.xml | 93 ++++ .../james/spamassassin/SpamAssassinInvoker.java | 251 +++++++++++ .../james/spamassassin/SpamAssassinResult.java | 109 +++++ .../spamassassin/SpamAssassinExtension.java | 148 +++++++ .../spamassassin/SpamAssassinInvokerTest.java | 147 +++++++ .../spamassassin/SpamAssassinResultTest.java | 96 +++++ .../spamassassin/SpamAssassinWaitStrategy.java | 67 +++ .../james/spamassassin/mock/MockSpamd.java | 101 +++++ .../spamassassin/mock/MockSpamdTestRule.java | 46 ++ .../resources/docker/spamassassin/Dockerfile | 43 ++ .../resources/docker/spamassassin/bayes_pg.sql | 119 ++++++ .../test/resources/docker/spamassassin/local.cf | 97 +++++ .../docker/spamassassin/rule-update.sh | 7 + .../test/resources/docker/spamassassin/run.sh | 9 + .../test/resources/docker/spamassassin/spamd.sh | 15 + .../src/test/resources/eml/spam.eml | 152 +++++++ .../src/test/resources/spamassassin_db/ham/ham1 | 113 +++++ .../src/test/resources/spamassassin_db/ham/ham2 | 73 ++++ .../src/test/resources/spamassassin_db/ham/ham3 | 82 ++++ .../src/test/resources/spamassassin_db/ham/ham4 | 78 ++++ .../src/test/resources/spamassassin_db/ham/ham5 | 77 ++++ .../src/test/resources/spamassassin_db/ham/ham6 | 74 ++++ .../src/test/resources/spamassassin_db/ham/ham7 | 88 ++++ .../src/test/resources/spamassassin_db/ham/ham8 | 85 ++++ .../src/test/resources/spamassassin_db/ham/ham9 | 176 ++++++++ .../test/resources/spamassassin_db/spam/spam1 | 108 +++++ .../test/resources/spamassassin_db/spam/spam2 | 186 ++++++++ .../test/resources/spamassassin_db/spam/spam3 | 211 +++++++++ .../test/resources/spamassassin_db/spam/spam4 | 213 ++++++++++ .../test/resources/spamassassin_db/spam/spam5 | 161 +++++++ .../test/resources/spamassassin_db/spam/spam6 | 423 +++++++++++++++++++ .../test/resources/spamassassin_db/spam/spam7 | 71 ++++ .../test/resources/spamassassin_db/spam/spam8 | 321 ++++++++++++++ .../test/resources/spamassassin_db/spam/spam9 | 142 +++++++ 88 files changed, 4304 insertions(+), 4130 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/mailbox/plugin/spamassassin/pom.xml ---------------------------------------------------------------------- diff --git a/mailbox/plugin/spamassassin/pom.xml b/mailbox/plugin/spamassassin/pom.xml index ec8f1c5..830e22d 100644 --- a/mailbox/plugin/spamassassin/pom.xml +++ b/mailbox/plugin/spamassassin/pom.xml @@ -52,6 +52,16 @@ <scope>test</scope> </dependency> <dependency> + <groupId>${james.groupId}</groupId> + <artifactId>apache-james-spamassassin</artifactId> + </dependency> + <dependency> + <groupId>${james.groupId}</groupId> + <artifactId>apache-james-spamassassin</artifactId> + <type>test-jar</type> + <scope>test</scope> + </dependency> + <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassin.java ---------------------------------------------------------------------- diff --git a/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassin.java b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassin.java index a2c19f0..b86fe28 100644 --- a/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassin.java +++ b/mailbox/plugin/spamassassin/src/main/java/org/apache/james/mailbox/spamassassin/SpamAssassin.java @@ -24,8 +24,8 @@ import java.util.List; import javax.inject.Inject; import org.apache.james.metrics.api.MetricFactory; +import org.apache.james.spamassassin.SpamAssassinInvoker; import org.apache.james.util.Host; -import org.apache.james.util.scanner.SpamAssassinInvoker; import com.github.fge.lambdas.Throwing; http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/mailbox/store/pom.xml ---------------------------------------------------------------------- diff --git a/mailbox/store/pom.xml b/mailbox/store/pom.xml index 00b476e..d4f4e48 100644 --- a/mailbox/store/pom.xml +++ b/mailbox/store/pom.xml @@ -72,6 +72,10 @@ <artifactId>james-server-util-java8</artifactId> </dependency> <dependency> + <groupId>${james.groupId}</groupId> + <artifactId>metrics-api</artifactId> + </dependency> + <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/pom.xml ---------------------------------------------------------------------- diff --git a/pom.xml b/pom.xml index 7d32655..29763a8 100644 --- a/pom.xml +++ b/pom.xml @@ -536,6 +536,7 @@ <module>mpt</module> <module>protocols</module> <module>server</module> + <module>third-party</module> </modules> <scm> @@ -704,6 +705,17 @@ </dependency> <dependency> <groupId>${james.groupId}</groupId> + <artifactId>apache-james-spamassassin</artifactId> + <version>${project.version}</version> + </dependency> + <dependency> + <groupId>${james.groupId}</groupId> + <artifactId>apache-james-spamassassin</artifactId> + <version>${project.version}</version> + <type>test-jar</type> + </dependency> + <dependency> + <groupId>${james.groupId}</groupId> <artifactId>apache-james-mailbox-api</artifactId> <version>${project.version}</version> </dependency> http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/pom.xml ---------------------------------------------------------------------- diff --git a/server/container/util/pom.xml b/server/container/util/pom.xml index 8f2a94e..fadfca7 100644 --- a/server/container/util/pom.xml +++ b/server/container/util/pom.xml @@ -34,28 +34,10 @@ <dependencies> <dependency> - <groupId>${james.groupId}</groupId> - <artifactId>javax-mail-extension</artifactId> - <type>test-jar</type> - <scope>test</scope> - </dependency> - <dependency> - <groupId>${james.groupId}</groupId> - <artifactId>metrics-api</artifactId> - </dependency> - <dependency> <groupId>com.google.guava</groupId> <artifactId>guava</artifactId> </dependency> <dependency> - <groupId>com.github.fge</groupId> - <artifactId>throwing-lambdas</artifactId> - </dependency> - <dependency> - <groupId>com.sun.mail</groupId> - <artifactId>javax.mail</artifactId> - </dependency> - <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> </dependency> @@ -87,11 +69,6 @@ <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> </dependency> - <dependency> - <groupId>org.testcontainers</groupId> - <artifactId>testcontainers</artifactId> - <scope>test</scope> - </dependency> </dependencies> <build> http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/main/java/org/apache/james/util/scanner/SpamAssassinInvoker.java ---------------------------------------------------------------------- diff --git a/server/container/util/src/main/java/org/apache/james/util/scanner/SpamAssassinInvoker.java b/server/container/util/src/main/java/org/apache/james/util/scanner/SpamAssassinInvoker.java deleted file mode 100644 index fe825aa..0000000 --- a/server/container/util/src/main/java/org/apache/james/util/scanner/SpamAssassinInvoker.java +++ /dev/null @@ -1,251 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ - -package org.apache.james.util.scanner; - -import java.io.BufferedOutputStream; -import java.io.BufferedReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.OutputStream; -import java.io.PrintWriter; -import java.net.Socket; -import java.net.UnknownHostException; -import java.util.Arrays; -import java.util.List; - -import javax.mail.MessagingException; -import javax.mail.internet.MimeMessage; - -import org.apache.commons.io.IOUtils; -import org.apache.james.metrics.api.MetricFactory; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.github.fge.lambdas.Throwing; -import com.google.common.base.Splitter; -import com.google.common.collect.Lists; - -/** - * Sends the message through daemonized SpamAssassin (spamd), visit <a - * href="SpamAssassin.org">SpamAssassin.org</a> for info on configuration. - */ -public class SpamAssassinInvoker { - private static final Logger LOGGER = LoggerFactory.getLogger(SpamAssassinInvoker.class); - - enum MessageClass { - HAM("ham"), - SPAM("spam"); - - private final String value; - - MessageClass(String value) { - this.value = value; - } - } - - private static final int SPAM_INDEX = 1; - private static final int HITS_INDEX = 3; - private static final int REQUIRED_HITS_INDEX = 5; - private static final String CRLF = "\r\n"; - - private final MetricFactory metricFactory; - private final String spamdHost; - private final int spamdPort; - - /** - * Init the spamassassin invoker - * - * @param spamdHost - * The host on which spamd runs - * @param spamdPort - */ - public SpamAssassinInvoker(MetricFactory metricFactory, String spamdHost, int spamdPort) { - this.metricFactory = metricFactory; - this.spamdHost = spamdHost; - this.spamdPort = spamdPort; - } - - /** - * Scan a MimeMessage for spam by passing it to spamd. - * - * @param message - * The MimeMessage to scan - * @return true if spam otherwise false - * @throws MessagingException - * if an error on scanning is detected - */ - public SpamAssassinResult scanMail(MimeMessage message, String user) throws MessagingException { - return metricFactory.withMetric( - "spamAssassin-check", - Throwing.supplier( - () -> scanMailWithAdditionalHeaders(message, - "User: " + user)) - .sneakyThrow()); - } - - public SpamAssassinResult scanMail(MimeMessage message) throws MessagingException { - return metricFactory.withMetric( - "spamAssassin-check", - Throwing.supplier( - () -> scanMailWithoutAdditionalHeaders(message)) - .sneakyThrow()); - } - - public SpamAssassinResult scanMailWithAdditionalHeaders(MimeMessage message, String... additionalHeaders) throws MessagingException { - try (Socket socket = new Socket(spamdHost, spamdPort); - OutputStream out = socket.getOutputStream(); - BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(out); - PrintWriter writer = new PrintWriter(bufferedOutputStream); - BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) { - - writer.write("CHECK SPAMC/1.2"); - writer.write(CRLF); - - Arrays.stream(additionalHeaders) - .forEach(header -> { - writer.write(header); - writer.write(CRLF); - }); - - writer.write(CRLF); - writer.flush(); - - // pass the message to spamd - message.writeTo(out); - out.flush(); - socket.shutdownOutput(); - - return in.lines() - .filter(this::isSpam) - .map(this::processSpam) - .findFirst() - .orElse(SpamAssassinResult.empty()); - } catch (UnknownHostException e) { - throw new MessagingException("Error communicating with spamd. Unknown host: " + spamdHost); - } catch (IOException | MessagingException e) { - throw new MessagingException("Error communicating with spamd on " + spamdHost + ":" + spamdPort, e); - } - } - - public SpamAssassinResult scanMailWithoutAdditionalHeaders(MimeMessage message) throws MessagingException { - return scanMailWithAdditionalHeaders(message); - } - - private SpamAssassinResult processSpam(String line) { - List<String> elements = Lists.newArrayList(Splitter.on(' ').split(line)); - - return builderFrom(elements) - .hits(elements.get(HITS_INDEX)) - .requiredHits(elements.get(REQUIRED_HITS_INDEX)) - .build(); - } - - private SpamAssassinResult.Builder builderFrom(List<String> elements) { - if (spam(elements.get(SPAM_INDEX))) { - return SpamAssassinResult.asSpam(); - } else { - return SpamAssassinResult.asHam(); - } - } - - private boolean spam(String string) { - try { - return Boolean.valueOf(string); - } catch (Exception e) { - LOGGER.warn("Fail parsing spamassassin answer: " + string); - return false; - } - } - - private boolean isSpam(String line) { - return line.startsWith("Spam:"); - } - - /** - * Tell spamd that the given MimeMessage is a spam. - * - * @param message - * The MimeMessage to tell - * @throws MessagingException - * if an error occured during learning. - */ - public boolean learnAsSpam(InputStream message, String user) throws MessagingException { - return metricFactory.withMetric( - "spamAssassin-spam-report", - Throwing.supplier( - () -> reportMessageAs(message, user, MessageClass.SPAM)) - .sneakyThrow()); - } - - /** - * Tell spamd that the given MimeMessage is a ham. - * - * @param message - * The MimeMessage to tell - * @throws MessagingException - * if an error occured during learning. - */ - public boolean learnAsHam(InputStream message, String user) throws MessagingException { - return metricFactory.withMetric( - "spamAssassin-ham-report", - Throwing.supplier( - () -> reportMessageAs(message, user, MessageClass.HAM)) - .sneakyThrow()); - } - - private boolean reportMessageAs(InputStream message, String user, MessageClass messageClass) throws MessagingException { - try (Socket socket = new Socket(spamdHost, spamdPort); - OutputStream out = socket.getOutputStream(); - BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(out); - PrintWriter writer = new PrintWriter(bufferedOutputStream); - BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()))) { - - byte[] byteArray = IOUtils.toByteArray(message); - writer.write("TELL SPAMC/1.2"); - writer.write(CRLF); - writer.write("Content-length: " + byteArray.length); - writer.write(CRLF); - writer.write("Message-class: " + messageClass.value); - writer.write(CRLF); - writer.write("Set: local, remote"); - writer.write(CRLF); - writer.write("User: " + user); - writer.write(CRLF); - writer.write(CRLF); - writer.flush(); - - out.write(byteArray); - out.flush(); - socket.shutdownOutput(); - - return in.lines() - .anyMatch(this::hasBeenSet); - } catch (UnknownHostException e) { - throw new MessagingException("Error communicating with spamd. Unknown host: " + spamdHost); - } catch (IOException e) { - throw new MessagingException("Error communicating with spamd on " + spamdHost + ":" + spamdPort, e); - } - } - - private boolean hasBeenSet(String line) { - return line.startsWith("DidSet: "); - } -} http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/main/java/org/apache/james/util/scanner/SpamAssassinResult.java ---------------------------------------------------------------------- diff --git a/server/container/util/src/main/java/org/apache/james/util/scanner/SpamAssassinResult.java b/server/container/util/src/main/java/org/apache/james/util/scanner/SpamAssassinResult.java deleted file mode 100644 index a48967f..0000000 --- a/server/container/util/src/main/java/org/apache/james/util/scanner/SpamAssassinResult.java +++ /dev/null @@ -1,109 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ -package org.apache.james.util.scanner; - -import java.util.Map; - -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableMap; - -public class SpamAssassinResult { - /** The mail attribute under which the status get stored */ - public static final String STATUS_MAIL_ATTRIBUTE_NAME = "org.apache.james.spamassassin.status"; - - /** The mail attribute under which the flag get stored */ - public static final String FLAG_MAIL_ATTRIBUTE_NAME = "org.apache.james.spamassassin.flag"; - - public static final String NO_RESULT = "?"; - - public static SpamAssassinResult empty() { - return asHam() - .hits(NO_RESULT) - .requiredHits(NO_RESULT) - .build(); - } - - public static Builder asSpam() { - return new Builder(true); - } - - public static Builder asHam() { - return new Builder(false); - } - - public static class Builder { - - private String hits; - private String requiredHits; - private final boolean isSpam; - - private Builder(boolean isSpam) { - this.isSpam = isSpam; - } - - public Builder hits(String hits) { - this.hits = hits; - return this; - } - - public Builder requiredHits(String requiredHits) { - this.requiredHits = requiredHits; - return this; - } - - public SpamAssassinResult build() { - Preconditions.checkNotNull(hits); - Preconditions.checkNotNull(requiredHits); - - ImmutableMap.Builder<String, String> headersAsAttribute = ImmutableMap.builder(); - if (isSpam) { - headersAsAttribute.put(FLAG_MAIL_ATTRIBUTE_NAME, "YES"); - headersAsAttribute.put(STATUS_MAIL_ATTRIBUTE_NAME, "Yes, hits=" + hits + " required=" + requiredHits); - } else { - headersAsAttribute.put(FLAG_MAIL_ATTRIBUTE_NAME, "NO"); - headersAsAttribute.put(STATUS_MAIL_ATTRIBUTE_NAME, "No, hits=" + hits + " required=" + requiredHits); - } - - return new SpamAssassinResult(hits, requiredHits, headersAsAttribute.build()); - } - } - - private final String hits; - private final String requiredHits; - private final Map<String, String> headersAsAttribute; - - private SpamAssassinResult(String hits, String requiredHits, Map<String, String> headersAsAttribute) { - this.hits = hits; - this.requiredHits = requiredHits; - this.headersAsAttribute = headersAsAttribute; - } - - public String getHits() { - return hits; - } - - public String getRequiredHits() { - return requiredHits; - } - - public Map<String, String> getHeadersAsAttribute() { - return headersAsAttribute; - } - -} http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinExtension.java ---------------------------------------------------------------------- diff --git a/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinExtension.java b/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinExtension.java deleted file mode 100644 index 46100bc..0000000 --- a/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinExtension.java +++ /dev/null @@ -1,148 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ - -package org.apache.james.util.scanner; - -import java.io.IOException; -import java.net.URISyntaxException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.Locale; -import java.util.stream.Stream; - -import org.junit.jupiter.api.extension.AfterEachCallback; -import org.junit.jupiter.api.extension.BeforeEachCallback; -import org.junit.jupiter.api.extension.ExtensionContext; -import org.junit.jupiter.api.extension.ParameterContext; -import org.junit.jupiter.api.extension.ParameterResolutionException; -import org.junit.jupiter.api.extension.ParameterResolver; -import org.testcontainers.containers.GenericContainer; -import org.testcontainers.images.builder.ImageFromDockerfile; - -import com.github.fge.lambdas.Throwing; - -public class SpamAssassinExtension implements BeforeEachCallback, AfterEachCallback, ParameterResolver { - - private final GenericContainer<?> spamAssassinContainer; - private SpamAssassin spamAssassin; - - public SpamAssassinExtension() { - spamAssassinContainer = new GenericContainer<>( - new ImageFromDockerfile() - .withFileFromClasspath("Dockerfile", "docker/spamassassin/Dockerfile") - .withFileFromClasspath("local.cf", "docker/spamassassin/local.cf") - .withFileFromClasspath("run.sh", "docker/spamassassin/run.sh") - .withFileFromClasspath("spamd.sh", "docker/spamassassin/spamd.sh") - .withFileFromClasspath("rule-update.sh", "docker/spamassassin/rule-update.sh") - .withFileFromClasspath("bayes_pg.sql", "docker/spamassassin/bayes_pg.sql")); - spamAssassinContainer.waitingFor(new SpamAssassinWaitStrategy(spamAssassinContainer)); - } - - @Override - public void beforeEach(ExtensionContext context) { - spamAssassinContainer.start(); - spamAssassin = new SpamAssassin(spamAssassinContainer); - } - - @Override - public void afterEach(ExtensionContext context) { - spamAssassinContainer.close(); - } - - @Override - public boolean supportsParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { - return (parameterContext.getParameter().getType() == SpamAssassin.class); - } - - @Override - public Object resolveParameter(ParameterContext parameterContext, ExtensionContext extensionContext) throws ParameterResolutionException { - return spamAssassin; - } - - public SpamAssassin getSpamAssassin() { - return spamAssassin; - } - - public static class SpamAssassin { - - private static final int SPAMASSASSIN_PORT = 783; - - private final String ip; - private final int bindingPort; - private final GenericContainer<?> spamAssassinContainer; - - private SpamAssassin(GenericContainer<?> spamAssassinContainer) { - this.spamAssassinContainer = spamAssassinContainer; - this.ip = spamAssassinContainer.getContainerIpAddress(); - this.bindingPort = spamAssassinContainer.getMappedPort(SPAMASSASSIN_PORT); - } - - public String getIp() { - return ip; - } - - public int getBindingPort() { - return bindingPort; - } - - public void train(String user) throws IOException, URISyntaxException { - train(user, Paths.get(ClassLoader.getSystemResource("spamassassin_db/spam").toURI()), TrainingKind.SPAM); - train(user, Paths.get(ClassLoader.getSystemResource("spamassassin_db/ham").toURI()), TrainingKind.HAM); - } - - private void train(String user, Path folder, TrainingKind trainingKind) throws IOException { - spamAssassinContainer.getDockerClient().copyArchiveToContainerCmd(spamAssassinContainer.getContainerId()) - .withHostResource(folder.toAbsolutePath().toString()) - .withRemotePath("/root") - .exec(); - try (Stream<Path> paths = Files.walk(folder)) { - paths - .filter(Files::isRegularFile) - .map(Path::toFile) - .forEach(Throwing.consumer(file -> spamAssassinContainer.execInContainer("sa-learn", - trainingKind.saLearnExtensionName(), "-u", user, - "/root/" + trainingKind.name().toLowerCase(Locale.US) + "/" + file.getName()))); - } - } - - private enum TrainingKind { - SPAM("--spam"), HAM("--ham"); - - private String saLearnExtensionName; - - TrainingKind(String saLearnExtensionName) { - this.saLearnExtensionName = saLearnExtensionName; - } - - public String saLearnExtensionName() { - return saLearnExtensionName; - } - } - - public void sync(String user) throws UnsupportedOperationException, IOException, InterruptedException { - spamAssassinContainer.execInContainer("sa-learn", "--sync", "-u", user); - } - - public void dump(String user) throws UnsupportedOperationException, IOException, InterruptedException { - spamAssassinContainer.execInContainer("sa-learn", "--dump", "magic", "-u", user); - } - } - -} http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinInvokerTest.java ---------------------------------------------------------------------- diff --git a/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinInvokerTest.java b/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinInvokerTest.java deleted file mode 100644 index 4901ba4..0000000 --- a/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinInvokerTest.java +++ /dev/null @@ -1,147 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ -package org.apache.james.util.scanner; - -import static org.assertj.core.api.Assertions.assertThat; - -import java.io.ByteArrayInputStream; -import java.nio.charset.StandardCharsets; - -import javax.mail.internet.MimeMessage; - -import org.apache.james.metrics.api.NoopMetricFactory; -import org.apache.james.util.MimeMessageUtil; -import org.apache.james.util.scanner.SpamAssassinExtension.SpamAssassin; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.Test; -import org.junit.jupiter.api.extension.ExtendWith; - -@ExtendWith(SpamAssassinExtension.class) -public class SpamAssassinInvokerTest { - - public static final String USER = "any@james"; - private SpamAssassin spamAssassin; - private SpamAssassinInvoker testee; - - @BeforeEach - public void setup(SpamAssassin spamAssassin) throws Exception { - this.spamAssassin = spamAssassin; - testee = new SpamAssassinInvoker(new NoopMetricFactory(), spamAssassin.getIp(), spamAssassin.getBindingPort()); - } - - @Test - public void scanMailShouldModifyHitsField() throws Exception { - MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromStream( - ClassLoader.getSystemResourceAsStream("eml/spam.eml")); - SpamAssassinResult result = testee.scanMail(mimeMessage, USER); - - assertThat(result.getHits()).isNotEqualTo(SpamAssassinResult.NO_RESULT); - } - - @Test - public void scanMailShouldModifyRequiredHitsField() throws Exception { - MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromStream( - ClassLoader.getSystemResourceAsStream("eml/spam.eml")); - SpamAssassinResult result = testee.scanMail(mimeMessage, USER); - - assertThat(result.getRequiredHits()).isEqualTo("5.0"); - } - - @Test - public void scanMailShouldModifyHeadersField() throws Exception { - MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromStream( - ClassLoader.getSystemResourceAsStream("eml/spam.eml")); - SpamAssassinResult result = testee.scanMail(mimeMessage, USER); - - assertThat(result.getHeadersAsAttribute()).isNotEmpty(); - } - - @Test - public void scanMailShouldMarkAsSpamWhenKnownAsSpam() throws Exception { - spamAssassin.train("user"); - - MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromStream( - ClassLoader.getSystemResourceAsStream("spamassassin_db/spam/spam1")); - - SpamAssassinResult result = testee.scanMail(mimeMessage, USER); - - assertThat(result.getHeadersAsAttribute().get(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME)).isEqualTo("YES"); - } - - @Test - public void learnAsSpamShouldReturnTrueWhenLearningWorks() throws Exception { - MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromStream( - ClassLoader.getSystemResourceAsStream("spamassassin_db/spam/spam2")); - - boolean result = testee.learnAsSpam(mimeMessage.getInputStream(), USER); - - assertThat(result).isTrue(); - } - - @Test - public void scanMailShouldMarkAsSpamWhenMessageAlreadyLearnedAsSpam() throws Exception { - MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromStream( - ClassLoader.getSystemResourceAsStream("spamassassin_db/spam/spam1")); - - byte[] messageAsBytes = MimeMessageUtil.asString(mimeMessage).getBytes(StandardCharsets.UTF_8); - - testee.learnAsSpam(new ByteArrayInputStream(messageAsBytes), USER); - - SpamAssassinResult result = testee.scanMail(mimeMessage, USER); - - assertThat(result.getHeadersAsAttribute().get(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME)).isEqualTo("YES"); - } - - @Test - public void learnAsHamShouldReturnTrueWhenLearningWorks() throws Exception { - MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromStream( - ClassLoader.getSystemResourceAsStream("spamassassin_db/ham/ham2")); - - boolean result = testee.learnAsHam(mimeMessage.getInputStream(), USER); - - assertThat(result).isTrue(); - } - - @Test - public void scanMailShouldMarkAsHamWhenMessageAlreadyLearnedAsHam() throws Exception { - MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromStream( - ClassLoader.getSystemResourceAsStream("spamassassin_db/ham/ham1")); - - testee.learnAsHam(mimeMessage.getInputStream(), USER); - - SpamAssassinResult result = testee.scanMail(mimeMessage, USER); - - assertThat(result.getHeadersAsAttribute().get(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME)).isEqualTo("NO"); - } - - @Test - public void learnAsHamShouldAllowToForgetSpam() throws Exception { - MimeMessage mimeMessage = MimeMessageUtil.mimeMessageFromStream( - ClassLoader.getSystemResourceAsStream("eml/spam.eml")); - - byte[] messageAsBytes = MimeMessageUtil.asString(mimeMessage).getBytes(StandardCharsets.UTF_8); - - testee.learnAsSpam(new ByteArrayInputStream(messageAsBytes), USER); - testee.learnAsHam(new ByteArrayInputStream(messageAsBytes), USER); - - SpamAssassinResult result = testee.scanMail(mimeMessage, USER); - - assertThat(result.getHeadersAsAttribute().get(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME)).isEqualTo("NO"); - } -} http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinResultTest.java ---------------------------------------------------------------------- diff --git a/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinResultTest.java b/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinResultTest.java deleted file mode 100644 index 0b67589..0000000 --- a/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinResultTest.java +++ /dev/null @@ -1,96 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ -package org.apache.james.util.scanner; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -import org.assertj.core.api.JUnitSoftAssertions; -import org.junit.Rule; -import org.junit.Test; - -import com.google.common.collect.ImmutableMap; - -public class SpamAssassinResultTest { - - @Rule - public JUnitSoftAssertions softly = new JUnitSoftAssertions(); - - @Test - public void buildShouldThrowWhenHitsIsNotGiven() { - assertThatThrownBy(() -> SpamAssassinResult.asSpam() - .requiredHits("4.0") - .build()) - .isInstanceOf(NullPointerException.class); - } - - @Test - public void buildShouldThrowWhenRequiredHitsIsNotGiven() { - assertThatThrownBy(() -> SpamAssassinResult.asSpam() - .hits("4.0") - .build()) - .isInstanceOf(NullPointerException.class); - } - - @Test - public void buildShouldWork() { - String hits = "1.1"; - String requiredHits = "5.0"; - - SpamAssassinResult spamAssassinResult = SpamAssassinResult.asSpam() - .hits(hits) - .requiredHits(requiredHits) - .build(); - - softly.assertThat(spamAssassinResult.getHits()).isEqualTo(hits); - softly.assertThat(spamAssassinResult.getRequiredHits()).isEqualTo(requiredHits); - softly.assertThat(spamAssassinResult.getHeadersAsAttribute()) - .containsAllEntriesOf(ImmutableMap.of( - SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME, "YES", - SpamAssassinResult.STATUS_MAIL_ATTRIBUTE_NAME, "Yes, hits=1.1 required=5.0")); - } - - @Test - public void headersAsAttributeShouldContainSpamHeaderWithYESValueWhenBuiltAsSpam() { - String hits = "1.1"; - String requiredHits = "5.0"; - - SpamAssassinResult spamAssassinResult = SpamAssassinResult.asSpam() - .hits(hits) - .requiredHits(requiredHits) - .build(); - - assertThat(spamAssassinResult.getHeadersAsAttribute()) - .containsEntry(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME, "YES"); - } - - @Test - public void headersAsAttributeShouldContainSpamHeaderWithNOValueWhenBuiltAsHam() { - String hits = "1.1"; - String requiredHits = "5.0"; - - SpamAssassinResult spamAssassinResult = SpamAssassinResult.asHam() - .hits(hits) - .requiredHits(requiredHits) - .build(); - - assertThat(spamAssassinResult.getHeadersAsAttribute()) - .containsEntry(SpamAssassinResult.FLAG_MAIL_ATTRIBUTE_NAME, "NO"); - } -} http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinWaitStrategy.java ---------------------------------------------------------------------- diff --git a/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinWaitStrategy.java b/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinWaitStrategy.java deleted file mode 100644 index 1341256..0000000 --- a/server/container/util/src/test/java/org/apache/james/util/scanner/SpamAssassinWaitStrategy.java +++ /dev/null @@ -1,67 +0,0 @@ -/**************************************************************** - * Licensed to the Apache Software Foundation (ASF) under one * - * or more contributor license agreements. See the NOTICE file * - * distributed with this work for additional information * - * regarding copyright ownership. The ASF licenses this file * - * to you under the Apache License, Version 2.0 (the * - * "License"); you may not use this file except in compliance * - * with the License. You may obtain a copy of the License at * - * * - * http://www.apache.org/licenses/LICENSE-2.0 * - * * - * Unless required by applicable law or agreed to in writing, * - * software distributed under the License is distributed on an * - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * - * KIND, either express or implied. See the License for the * - * specific language governing permissions and limitations * - * under the License. * - ****************************************************************/ - -package org.apache.james.util.scanner; - -import java.io.IOException; -import java.time.Duration; -import java.util.concurrent.TimeUnit; - -import org.rnorth.ducttape.unreliables.Unreliables; -import org.testcontainers.containers.GenericContainer; -import org.testcontainers.containers.wait.strategy.WaitStrategy; -import org.testcontainers.containers.wait.strategy.WaitStrategyTarget; - -import com.google.common.primitives.Ints; - -public class SpamAssassinWaitStrategy implements WaitStrategy { - - private static final Duration DEFAULT_TIMEOUT = Duration.ofMinutes(1); - private final GenericContainer<?> spamAssassinContainer; - private Duration timeout = DEFAULT_TIMEOUT; - - public SpamAssassinWaitStrategy(GenericContainer<?> spamAssassinContainer) { - this(spamAssassinContainer, DEFAULT_TIMEOUT); - } - - public SpamAssassinWaitStrategy(GenericContainer<?> spamAssassinContainer, Duration timeout) { - this.spamAssassinContainer = spamAssassinContainer; - this.timeout = timeout; - } - - @Override - public void waitUntilReady(WaitStrategyTarget waitStrategyTarget) { - Unreliables.retryUntilTrue(Ints.checkedCast(timeout.getSeconds()), TimeUnit.SECONDS, () -> { - try { - return spamAssassinContainer - .execInContainer("spamassassin", "-V") - .getStdout() - .contains("SpamAssassin version 3.4.1"); - } catch (IOException | InterruptedException e) { - return false; - } - } - ); - } - - @Override - public WaitStrategy withStartupTimeout(Duration startupTimeout) { - return new SpamAssassinWaitStrategy(spamAssassinContainer, startupTimeout); - } -} http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/docker/spamassassin/Dockerfile ---------------------------------------------------------------------- diff --git a/server/container/util/src/test/resources/docker/spamassassin/Dockerfile b/server/container/util/src/test/resources/docker/spamassassin/Dockerfile deleted file mode 100644 index ad1187a..0000000 --- a/server/container/util/src/test/resources/docker/spamassassin/Dockerfile +++ /dev/null @@ -1,43 +0,0 @@ -FROM postgres:10.3 - -ENV SPAMASSASSIN_VERSION 3.4.1 - -RUN apt-get update && \ - DEBIAN_FRONTEND=noninteractive apt-get install --no-install-recommends -y \ - gpg \ - libio-socket-ip-perl \ - libmail-dkim-perl \ - libnet-ident-perl \ - libsocket-getaddrinfo-perl \ - pyzor \ - razor \ - libdbi-perl \ - libdbd-pg-perl \ - spamassassin=${SPAMASSASSIN_VERSION}* && \ - apt-get clean && \ - rm -rf /var/lib/apt/lists/* - -RUN mkdir -p /etc/spamassassin/sa-update-keys && \ - chmod 700 /etc/spamassassin/sa-update-keys && \ - chown debian-spamd:debian-spamd /etc/spamassassin/sa-update-keys && \ - mkdir -p /var/lib/spamassassin/.pyzor && \ - chmod 700 /var/lib/spamassassin/.pyzor && \ - echo "public.pyzor.org:24441" > /var/lib/spamassassin/.pyzor/servers && \ - chmod 600 /var/lib/spamassassin/.pyzor/servers && \ - chown -R debian-spamd:debian-spamd /var/lib/spamassassin/.pyzor - -RUN sed -i 's/^logfile = .*$/logfile = \/dev\/stderr/g' /etc/razor/razor-agent.conf - -COPY spamd.sh / -COPY rule-update.sh / -COPY run.sh / -RUN chmod 755 /spamd.sh /rule-update.sh /run.sh - -COPY local.cf /etc/spamassassin/ - -# Bayes database will be created automatically by Postres -COPY bayes_pg.sql /docker-entrypoint-initdb.d/ - -EXPOSE 783 - -ENTRYPOINT ["/spamd.sh"] http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/docker/spamassassin/bayes_pg.sql ---------------------------------------------------------------------- diff --git a/server/container/util/src/test/resources/docker/spamassassin/bayes_pg.sql b/server/container/util/src/test/resources/docker/spamassassin/bayes_pg.sql deleted file mode 100644 index ef96472..0000000 --- a/server/container/util/src/test/resources/docker/spamassassin/bayes_pg.sql +++ /dev/null @@ -1,119 +0,0 @@ - -CREATE TABLE bayes_expire ( - id integer NOT NULL default '0', - runtime integer NOT NULL default '0' -) WITHOUT OIDS; - -CREATE INDEX bayes_expire_idx1 ON bayes_expire (id); - -CREATE TABLE bayes_global_vars ( - variable varchar(30) NOT NULL default '', - value varchar(200) NOT NULL default '', - PRIMARY KEY (variable) -) WITHOUT OIDS; - -INSERT INTO bayes_global_vars VALUES ('VERSION','3'); - -CREATE TABLE bayes_seen ( - id integer NOT NULL default '0', - msgid varchar(200) NOT NULL default '', - flag character(1) NOT NULL default '', - PRIMARY KEY (id,msgid) -) WITHOUT OIDS; - -CREATE TABLE bayes_token ( - id integer NOT NULL default '0', - token bytea NOT NULL default '', - spam_count integer NOT NULL default '0', - ham_count integer NOT NULL default '0', - atime integer NOT NULL default '0', - PRIMARY KEY (id,token) -) WITHOUT OIDS; - -CREATE INDEX bayes_token_idx1 ON bayes_token (token); - -ALTER TABLE bayes_token SET (fillfactor=95); - -CREATE TABLE bayes_vars ( - id serial NOT NULL, - username varchar(200) NOT NULL default '', - spam_count integer NOT NULL default '0', - ham_count integer NOT NULL default '0', - token_count integer NOT NULL default '0', - last_expire integer NOT NULL default '0', - last_atime_delta integer NOT NULL default '0', - last_expire_reduce integer NOT NULL default '0', - oldest_token_age integer NOT NULL default '2147483647', - newest_token_age integer NOT NULL default '0', - PRIMARY KEY (id) -) WITHOUT OIDS; - -CREATE UNIQUE INDEX bayes_vars_idx1 ON bayes_vars (username); - -CREATE OR REPLACE FUNCTION greatest_int (integer, integer) - RETURNS INTEGER - IMMUTABLE STRICT - AS 'SELECT CASE WHEN $1 < $2 THEN $2 ELSE $1 END;' - LANGUAGE SQL; - -CREATE OR REPLACE FUNCTION least_int (integer, integer) - RETURNS INTEGER - IMMUTABLE STRICT - AS 'SELECT CASE WHEN $1 < $2 THEN $1 ELSE $2 END;' - LANGUAGE SQL; - -CREATE OR REPLACE FUNCTION put_tokens(INTEGER, - BYTEA[], - INTEGER, - INTEGER, - INTEGER) -RETURNS VOID AS ' -DECLARE - inuserid ALIAS FOR $1; - intokenary ALIAS FOR $2; - inspam_count ALIAS FOR $3; - inham_count ALIAS FOR $4; - inatime ALIAS FOR $5; - _token BYTEA; - new_tokens INTEGER := 0; -BEGIN - for i in array_lower(intokenary, 1) .. array_upper(intokenary, 1) - LOOP - _token := intokenary[i]; - UPDATE bayes_token - SET spam_count = greatest_int(spam_count + inspam_count, 0), - ham_count = greatest_int(ham_count + inham_count, 0), - atime = greatest_int(atime, inatime) - WHERE id = inuserid - AND token = _token; - IF NOT FOUND THEN - -- we do not insert negative counts, just return true - IF NOT (inspam_count < 0 OR inham_count < 0) THEN - INSERT INTO bayes_token (id, token, spam_count, ham_count, atime) - VALUES (inuserid, _token, inspam_count, inham_count, inatime); - IF FOUND THEN - new_tokens := new_tokens + 1; - END IF; - END IF; - END IF; - END LOOP; - - IF new_tokens > 0 AND inatime > 0 THEN - UPDATE bayes_vars - SET token_count = token_count + new_tokens, - newest_token_age = greatest_int(newest_token_age, inatime), - oldest_token_age = least_int(oldest_token_age, inatime) - WHERE id = inuserid; - ELSIF new_tokens > 0 AND NOT inatime > 0 THEN - UPDATE bayes_vars - SET token_count = token_count + new_tokens - WHERE id = inuserid; - ELSIF NOT new_tokens > 0 AND inatime > 0 THEN - UPDATE bayes_vars - SET newest_token_age = greatest_int(newest_token_age, inatime), - oldest_token_age = least_int(oldest_token_age, inatime) - WHERE id = inuserid; - END IF; - RETURN; -END; -' LANGUAGE 'plpgsql'; http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/docker/spamassassin/local.cf ---------------------------------------------------------------------- diff --git a/server/container/util/src/test/resources/docker/spamassassin/local.cf b/server/container/util/src/test/resources/docker/spamassassin/local.cf deleted file mode 100644 index 6005e55..0000000 --- a/server/container/util/src/test/resources/docker/spamassassin/local.cf +++ /dev/null @@ -1,97 +0,0 @@ -# This is the right place to customize your installation of SpamAssassin. -# -# See 'perldoc Mail::SpamAssassin::Conf' for details of what can be -# tweaked. -# -# Only a small subset of options are listed below -# -########################################################################### - -# Add *****SPAM***** to the Subject header of spam e-mails -# -# rewrite_header Subject *****SPAM***** - - -# Save spam messages as a message/rfc822 MIME attachment instead of -# modifying the original message (0: off, 2: use text/plain instead) -# -# report_safe 1 - - -# Set which networks or hosts are considered 'trusted' by your mail -# server (i.e. not spammers) -# -# trusted_networks 212.17.35. - - -# Set file-locking method (flock is not safe over NFS, but is faster) -# -# lock_method flock - - -# Set the threshold at which a message is considered spam (default: 5.0) -# -# required_score 5.0 - - -# Use Bayesian classifier (default: 1) -# -use_bayes 1 - - -# Bayesian classifier auto-learning (default: 1) -# -#bayes_auto_learn 1 - -bayes_store_module Mail::SpamAssassin::BayesStore::PgSQL - -bayes_sql_dsn DBI:Pg:dbname=postgres;host=localhost -bayes_sql_username postgres - -bayes_min_spam_num 1 -bayes_min_ham_num 1 - - -# Set headers which may provide inappropriate cues to the Bayesian -# classifier -# -# bayes_ignore_header X-Bogosity -# bayes_ignore_header X-Spam-Flag -# bayes_ignore_header X-Spam-Status - - -# Whether to decode non- UTF-8 and non-ASCII textual parts and recode -# them to UTF-8 before the text is given over to rules processing. -# -# normalize_charset 1 - -# Some shortcircuiting, if the plugin is enabled -# -ifplugin Mail::SpamAssassin::Plugin::Shortcircuit -# -# default: strongly-whitelisted mails are *really* whitelisted now, if the -# shortcircuiting plugin is active, causing early exit to save CPU load. -# Uncomment to turn this on -# -# shortcircuit USER_IN_WHITELIST on -# shortcircuit USER_IN_DEF_WHITELIST on -# shortcircuit USER_IN_ALL_SPAM_TO on -# shortcircuit SUBJECT_IN_WHITELIST on - -# the opposite; blacklisted mails can also save CPU -# -# shortcircuit USER_IN_BLACKLIST on -# shortcircuit USER_IN_BLACKLIST_TO on -# shortcircuit SUBJECT_IN_BLACKLIST on - -# if you have taken the time to correctly specify your "trusted_networks", -# this is another good way to save CPU -# -# shortcircuit ALL_TRUSTED on - -# and a well-trained bayes DB can save running rules, too -# -# shortcircuit BAYES_99 spam -# shortcircuit BAYES_00 ham - -endif # Mail::SpamAssassin::Plugin::Shortcircuit http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/docker/spamassassin/rule-update.sh ---------------------------------------------------------------------- diff --git a/server/container/util/src/test/resources/docker/spamassassin/rule-update.sh b/server/container/util/src/test/resources/docker/spamassassin/rule-update.sh deleted file mode 100755 index 2867735..0000000 --- a/server/container/util/src/test/resources/docker/spamassassin/rule-update.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash - -while true; do - sleep 1m - su debian-spamd -c 'sa-update' && kill -HUP `cat /var/run/spamd.pid` - sleep 1d -done http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/docker/spamassassin/run.sh ---------------------------------------------------------------------- diff --git a/server/container/util/src/test/resources/docker/spamassassin/run.sh b/server/container/util/src/test/resources/docker/spamassassin/run.sh deleted file mode 100755 index b4a1351..0000000 --- a/server/container/util/src/test/resources/docker/spamassassin/run.sh +++ /dev/null @@ -1,9 +0,0 @@ -#!/bin/bash -set -m - -/rule-update.sh & -/spamd.sh & - -pids=`jobs -p` - -wait http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/docker/spamassassin/spamd.sh ---------------------------------------------------------------------- diff --git a/server/container/util/src/test/resources/docker/spamassassin/spamd.sh b/server/container/util/src/test/resources/docker/spamassassin/spamd.sh deleted file mode 100755 index 2093cf8..0000000 --- a/server/container/util/src/test/resources/docker/spamassassin/spamd.sh +++ /dev/null @@ -1,15 +0,0 @@ -#!/bin/bash - -echo "Run Postgres" -/usr/local/bin/docker-entrypoint.sh postgres & - -echo "Run spamd" -spamd --username debian-spamd \ - --nouser-config \ - --syslog stderr \ - --pidfile /var/run/spamd.pid \ - --helper-home-dir /var/lib/spamassassin \ - --ip-address \ - --allowed-ips 0.0.0.0/0 \ - --allow-tell \ - --debug bayes,learn http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/eml/spam.eml ---------------------------------------------------------------------- diff --git a/server/container/util/src/test/resources/eml/spam.eml b/server/container/util/src/test/resources/eml/spam.eml deleted file mode 100755 index faf3402..0000000 --- a/server/container/util/src/test/resources/eml/spam.eml +++ /dev/null @@ -1,152 +0,0 @@ -Return-Path: <u...@james.org> -Subject: Fwd: Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00 - (CET) (u...@james.org) -To: <u...@james.org> -From: user <u...@james.org> -Message-ID: <f18fa52e-2e9d-1125-327d-2100b23f8...@james.org> -Date: Thu, 19 Jan 2017 20:36:37 +0100 -MIME-Version: 1.0 -In-Reply-To: <001a114380a6a260d10546776...@google.com> -Content-Type: multipart/mixed; - boundary="------------17D96D411CBD55D8239A8C1F" - -This is a multi-part message in MIME format. ---------------17D96D411CBD55D8239A8C1F -Content-Type: multipart/alternative; - boundary="------------64D716A3DDAEC185D3E67448" - - ---------------64D716A3DDAEC185D3E67448 -Content-Type: text/plain; charset=utf-8; format=flowed -Content-Transfer-Encoding: 8bit - - - - --------- Message transéré -------- -Sujet : Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - 15:00 -(CET) (u...@james.org) -Date : Thu, 19 Jan 2017 19:18:23 +0000 -De : <u...@james.org> -Répondre à : u...@james.org -Pour : u...@james.org - - - - ---------------64D716A3DDAEC185D3E67448 -Content-Type: text/html; charset=utf-8 -Content-Transfer-Encoding: 8bit - -<html> - <head> - - <meta http-equiv="content-type" content="text/html; charset=utf-8"> - </head> - <body bgcolor="#FFFFFF" text="#000000"> - <p><br> - </p> - <div class="moz-forward-container"><br> - <br> - -------- Message transéré -------- - <table class="moz-email-headers-table" border="0" cellpadding="0" - cellspacing="0"> - <tbody> - <tr> - <th align="RIGHT" valign="BASELINE" nowrap="nowrap">Sujetà : - </th> - <td>Invitation: (Aucun objet) - ven. 20 janv. 2017 14:00 - - 15:00 (CET) (<a class="moz-txt-link-abbreviated" href="mailto:u...@james.org">u...@james.org</a>)</td> - </tr> - <tr> - <th align="RIGHT" valign="BASELINE" nowrap="nowrap">Dateà : </th> - <td>Thu, 19 Jan 2017 19:18:23 +0000</td> - </tr> - <tr> - <th align="RIGHT" valign="BASELINE" nowrap="nowrap">Deà : </th> - <td>User <a class="moz-txt-link-rfc2396E" href="mailto:u...@james.org"><u...@james.org></a></td> - </tr> - <tr> - <th align="RIGHT" valign="BASELINE" nowrap="nowrap">Répondre - à à : </th> - <td><a class="moz-txt-link-abbreviated" href="mailto:u...@james.org">u...@james.org</a></td> - </tr> - <tr> - <th align="RIGHT" valign="BASELINE" nowrap="nowrap">Pourà : </th> - <td><a class="moz-txt-link-abbreviated" href="mailto:u...@james.org">u...@james.org</a></td> - </tr> - </tbody> - </table> - <br> - <br> - </div> - </body> -</html> - ---------------64D716A3DDAEC185D3E67448-- - ---------------17D96D411CBD55D8239A8C1F -Content-Type: text/calendar; - name="Portion de message joint" -Content-Transfer-Encoding: 8bit -Content-Disposition: attachment; - filename="Portion de message joint" - -BEGIN:VCALENDAR -PRODID:-//Google Inc//Google Calendar 70.9054//EN -VERSION:2.0 -CALSCALE:GREGORIAN -METHOD:REQUEST -BEGIN:VEVENT -DTSTART:20170120T130000Z -DTEND:20170120T140000Z -DTSTAMP:20170119T191823Z -ORGANIZER;CN=User:mailto:u...@james.org -UID:ah86k5m342bmcrbe9khkkhl...@google.com -ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=NEEDS-ACTION;RSVP= - TRUE;CN=u...@james.org;X-NUM-GUESTS=0:mailto:u...@james.org -ATTENDEE;CUTYPE=INDIVIDUAL;ROLE=REQ-PARTICIPANT;PARTSTAT=ACCEPTED;RSVP=TRUE - ;CN=User;X-NUM-GUESTS=0:mailto:u...@james.org -CREATED:20170119T191823Z -DESCRIPTION:Affichez votre evenement sur la page https://www.google.com/cal - endar/event?action=VIEW&eid=YWg4Nms1bTM0MmJtY3JiZTlraGtraGxuMDAgYWR1cHJhdEB - saW5hZ29yYS5jb20&tok=MTkjYW50ZHVwcmF0QGdtYWlsLmNvbTg1OTM5NWM4MGRlYmE1YTI4Nz - RjN2UyNjU0M2YyZmQ4NzRkNThhYTQ&ctz=Europe/Paris&hl=fr. -LAST-MODIFIED:20170119T191823Z -LOCATION: -SEQUENCE:0 -STATUS:CONFIRMED -SUMMARY: -TRANSP:OPAQUE -END:VEVENT -END:VCALENDAR - - ---------------17D96D411CBD55D8239A8C1F -Content-Type: application/ics; - name="invite.ics" -Content-Transfer-Encoding: base64 -Content-Disposition: attachment; - filename="invite.ics" - -QkVHSU46VkNBTEVOREFSDQpQUk9ESUQ6LS8vR29vZ2xlIEluYy8vR29vZ2xlIENhbGVuZGFy -IDcwLjkwNTQvL0VODQpWRVJTSU9OOjIuMA0KQ0FMU0NBTEU6R1JFR09SSUFODQpNRVRIT0Q6 -UkVRVUVTVA0KQkVHSU46VkVWRU5UDQpEVFNUQVJUOjIwMTcwMTIwVDEzMDAwMFoNCkRURU5E -OjIwMTcwMTIwVDE0MDAwMFoNCkRUU1RBTVA6MjAxNzAxMTlUMTkxODIzWg0KT1JHQU5JWkVS -O0NOPUFudG9pbmUgRHVwcmF0Om1haWx0bzphbnRkdXByYXRAZ21haWwuY29tDQpVSUQ6YWg4 -Nms1bTM0MmJtY3JiZTlraGtraGxuMDBAZ29vZ2xlLmNvbQ0KQVRURU5ERUU7Q1VUWVBFPUlO -RElWSURVQUw7Uk9MRT1SRVEtUEFSVElDSVBBTlQ7UEFSVFNUQVQ9TkVFRFMtQUNUSU9OO1JT -VlA9DQogVFJVRTtDTj1hZHVwcmF0QGxpbmFnb3JhLmNvbTtYLU5VTS1HVUVTVFM9MDptYWls -dG86YWR1cHJhdEBsaW5hZ29yYS5jb20NCkFUVEVOREVFO0NVVFlQRT1JTkRJVklEVUFMO1JP -TEU9UkVRLVBBUlRJQ0lQQU5UO1BBUlRTVEFUPUFDQ0VQVEVEO1JTVlA9VFJVRQ0KIDtDTj1B -bnRvaW5lIER1cHJhdDtYLU5VTS1HVUVTVFM9MDptYWlsdG86YW50ZHVwcmF0QGdtYWlsLmNv -bQ0KQ1JFQVRFRDoyMDE3MDExOVQxOTE4MjNaDQpERVNDUklQVElPTjpBZmZpY2hleiB2b3Ry -ZSDDqXbDqW5lbWVudCBzdXIgbGEgcGFnZSBodHRwczovL3d3dy5nb29nbGUuY29tL2NhbA0K -IGVuZGFyL2V2ZW50P2FjdGlvbj1WSUVXJmVpZD1ZV2c0Tm1zMWJUTTBNbUp0WTNKaVpUbHJh -R3RyYUd4dU1EQWdZV1IxY0hKaGRFQg0KIHNhVzVoWjI5eVlTNWpiMjAmdG9rPU1Ua2pZVzUw -WkhWd2NtRjBRR2R0WVdsc0xtTnZiVGcxT1RNNU5XTTRNR1JsWW1FMVlUSTROeg0KIFJqTjJV -eU5qVTBNMll5Wm1RNE56UmtOVGhoWVRRJmN0ej1FdXJvcGUvUGFyaXMmaGw9ZnIuDQpMQVNU -LU1PRElGSUVEOjIwMTcwMTE5VDE5MTgyM1oNCkxPQ0FUSU9OOg0KU0VRVUVOQ0U6MA0KU1RB -VFVTOkNPTkZJUk1FRA0KU1VNTUFSWToNClRSQU5TUDpPUEFRVUUNCkVORDpWRVZFTlQNCkVO -RDpWQ0FMRU5EQVINCg== ---------------17D96D411CBD55D8239A8C1F-- http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/spamassassin_db/ham/ham1 ---------------------------------------------------------------------- diff --git a/server/container/util/src/test/resources/spamassassin_db/ham/ham1 b/server/container/util/src/test/resources/spamassassin_db/ham/ham1 deleted file mode 100644 index c50bb11..0000000 --- a/server/container/util/src/test/resources/spamassassin_db/ham/ham1 +++ /dev/null @@ -1,113 +0,0 @@ -From exmh-workers-ad...@redhat.com Thu Aug 22 12:36:23 2002 -Return-Path: <exmh-workers-ad...@spamassassin.taint.org> -Delivered-To: z...@localhost.netnoteinc.com -Received: from localhost (localhost [127.0.0.1]) - by phobos.labs.netnoteinc.com (Postfix) with ESMTP id D03E543C36 - for <zzzz@localhost>; Thu, 22 Aug 2002 07:36:16 -0400 (EDT) -Received: from phobos [127.0.0.1] - by localhost with IMAP (fetchmail-5.9.0) - for zzzz@localhost (single-drop); Thu, 22 Aug 2002 12:36:16 +0100 (IST) -Received: from listman.spamassassin.taint.org (listman.spamassassin.taint.org [66.187.233.211]) by - dogma.slashnull.org (8.11.6/8.11.6) with ESMTP id g7MBYrZ04811 for - <zzzz-e...@spamassassin.taint.org>; Thu, 22 Aug 2002 12:34:53 +0100 -Received: from listman.spamassassin.taint.org (localhost.localdomain [127.0.0.1]) by - listman.redhat.com (Postfix) with ESMTP id 8386540858; Thu, 22 Aug 2002 - 07:35:02 -0400 (EDT) -Delivered-To: exmh-work...@listman.spamassassin.taint.org -Received: from int-mx1.corp.spamassassin.taint.org (int-mx1.corp.spamassassin.taint.org - [172.16.52.254]) by listman.redhat.com (Postfix) with ESMTP id 10CF8406D7 - for <exmh-work...@listman.redhat.com>; Thu, 22 Aug 2002 07:34:10 -0400 - (EDT) -Received: (from mail@localhost) by int-mx1.corp.spamassassin.taint.org (8.11.6/8.11.6) - id g7MBY7g11259 for exmh-work...@listman.redhat.com; Thu, 22 Aug 2002 - 07:34:07 -0400 -Received: from mx1.spamassassin.taint.org (mx1.spamassassin.taint.org [172.16.48.31]) by - int-mx1.corp.redhat.com (8.11.6/8.11.6) with SMTP id g7MBY7Y11255 for - <exmh-work...@redhat.com>; Thu, 22 Aug 2002 07:34:07 -0400 -Received: from ratree.psu.ac.th ([202.28.97.6]) by mx1.spamassassin.taint.org - (8.11.6/8.11.6) with SMTP id g7MBIhl25223 for <exmh-work...@redhat.com>; - Thu, 22 Aug 2002 07:18:55 -0400 -Received: from delta.cs.mu.OZ.AU (delta.coe.psu.ac.th [172.30.0.98]) by - ratree.psu.ac.th (8.11.6/8.11.6) with ESMTP id g7MBWel29762; - Thu, 22 Aug 2002 18:32:40 +0700 (ICT) -Received: from munnari.OZ.AU (localhost [127.0.0.1]) by delta.cs.mu.OZ.AU - (8.11.6/8.11.6) with ESMTP id g7MBQPW13260; Thu, 22 Aug 2002 18:26:25 - +0700 (ICT) -From: Robert Elz <k...@munnari.oz.au> -To: Chris Garrigues <cwg-dated-1030377287.06f...@deepeddy.com> -Cc: exmh-work...@spamassassin.taint.org -Subject: Re: New Sequences Window -In-Reply-To: <1029945287.4797.t...@deepeddy.vircio.com> -References: <1029945287.4797.t...@deepeddy.vircio.com> - <1029882468.3116.t...@deepeddy.vircio.com> <9627.1029933...@munnari.oz.au> - <1029943066.26919.t...@deepeddy.vircio.com> - <1029944441.398.t...@deepeddy.vircio.com> -MIME-Version: 1.0 -Content-Type: text/plain; charset=us-ascii -Message-Id: <13258.1030015...@munnari.oz.au> -X-Loop: exmh-work...@spamassassin.taint.org -Sender: exmh-workers-ad...@spamassassin.taint.org -Errors-To: exmh-workers-ad...@spamassassin.taint.org -X-Beenthere: exmh-work...@spamassassin.taint.org -X-Mailman-Version: 2.0.1 -Precedence: bulk -List-Help: <mailto:exmh-workers-requ...@spamassassin.taint.org?subject=help> -List-Post: <mailto:exmh-work...@spamassassin.taint.org> -List-Subscribe: <https://listman.spamassassin.taint.org/mailman/listinfo/exmh-workers>, - <mailto:exmh-workers-requ...@redhat.com?subject=subscribe> -List-Id: Discussion list for EXMH developers <exmh-workers.spamassassin.taint.org> -List-Unsubscribe: <https://listman.spamassassin.taint.org/mailman/listinfo/exmh-workers>, - <mailto:exmh-workers-requ...@redhat.com?subject=unsubscribe> -List-Archive: <https://listman.spamassassin.taint.org/mailman/private/exmh-workers/> -Date: Thu, 22 Aug 2002 18:26:25 +0700 - - Date: Wed, 21 Aug 2002 10:54:46 -0500 - From: Chris Garrigues <cwg-dated-1030377287.06f...@deepeddy.com> - Message-ID: <1029945287.4797.t...@deepeddy.vircio.com> - - - | I can't reproduce this error. - -For me it is very repeatable... (like every time, without fail). - -This is the debug log of the pick happening ... - -18:19:03 Pick_It {exec pick +inbox -list -lbrace -lbrace -subject ftp -rbrace -rbrace} {4852-4852 -sequence mercury} -18:19:03 exec pick +inbox -list -lbrace -lbrace -subject ftp -rbrace -rbrace 4852-4852 -sequence mercury -18:19:04 Ftoc_PickMsgs {{1 hit}} -18:19:04 Marking 1 hits -18:19:04 tkerror: syntax error in expression "int ... - -Note, if I run the pick command by hand ... - -delta$ pick +inbox -list -lbrace -lbrace -subject ftp -rbrace -rbrace 4852-4852 -sequence mercury -1 hit - -That's where the "1 hit" comes from (obviously). The version of nmh I'm -using is ... - -delta$ pick -version -pick -- nmh-1.0.4 [compiled on fuchsia.cs.mu.OZ.AU at Sun Mar 17 14:55:56 ICT 2002] - -And the relevant part of my .mh_profile ... - -delta$ mhparam pick --seq sel -list - - -Since the pick command works, the sequence (actually, both of them, the -one that's explicit on the command line, from the search popup, and the -one that comes from .mh_profile) do get created. - -kre - -ps: this is still using the version of the code form a day ago, I haven't -been able to reach the cvs repository today (local routing issue I think). - - - -_______________________________________________ -Exmh-workers mailing list -exmh-work...@redhat.com -https://listman.redhat.com/mailman/listinfo/exmh-workers - http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/spamassassin_db/ham/ham2 ---------------------------------------------------------------------- diff --git a/server/container/util/src/test/resources/spamassassin_db/ham/ham2 b/server/container/util/src/test/resources/spamassassin_db/ham/ham2 deleted file mode 100644 index 7a5b23a..0000000 --- a/server/container/util/src/test/resources/spamassassin_db/ham/ham2 +++ /dev/null @@ -1,73 +0,0 @@ -From steve_b...@cursor-system.com Thu Aug 22 12:46:39 2002 -Return-Path: <steve_b...@cursor-system.com> -Delivered-To: z...@localhost.netnoteinc.com -Received: from localhost (localhost [127.0.0.1]) - by phobos.labs.netnoteinc.com (Postfix) with ESMTP id BE12E43C34 - for <zzzz@localhost>; Thu, 22 Aug 2002 07:46:38 -0400 (EDT) -Received: from phobos [127.0.0.1] - by localhost with IMAP (fetchmail-5.9.0) - for zzzz@localhost (single-drop); Thu, 22 Aug 2002 12:46:38 +0100 (IST) -Received: from n20.grp.scd.yahoo.com (n20.grp.scd.yahoo.com - [66.218.66.76]) by dogma.slashnull.org (8.11.6/8.11.6) with SMTP id - g7MBkTZ05087 for <z...@spamassassin.taint.org>; Thu, 22 Aug 2002 12:46:29 +0100 -X-Egroups-Return: sentto-2242572-52726-1030016790-zzzz=spamassassin.taint....@returns.groups.yahoo.com -Received: from [66.218.67.196] by n20.grp.scd.yahoo.com with NNFMP; - 22 Aug 2002 11:46:30 -0000 -X-Sender: steve.b...@cursor-system.com -X-Apparently-To: zzzzte...@yahoogroups.com -Received: (EGP: mail-8_1_0_1); 22 Aug 2002 11:46:29 -0000 -Received: (qmail 11764 invoked from network); 22 Aug 2002 11:46:29 -0000 -Received: from unknown (66.218.66.217) by m3.grp.scd.yahoo.com with QMQP; - 22 Aug 2002 11:46:29 -0000 -Received: from unknown (HELO mailgateway.cursor-system.com) (62.189.7.27) - by mta2.grp.scd.yahoo.com with SMTP; 22 Aug 2002 11:46:29 -0000 -Received: from exchange1.cps.local (unverified) by - mailgateway.cursor-system.com (Content Technologies SMTPRS 4.2.10) with - ESMTP id <t5cde81f695ac1d1004...@mailgateway.cursor-system.com> for - <forte...@yahoogroups.com>; Thu, 22 Aug 2002 13:14:10 +0100 -Received: by exchange1.cps.local with Internet Mail Service (5.5.2653.19) - id <PXX6AT23>; Thu, 22 Aug 2002 12:46:27 +0100 -Message-Id: <5ec2ad6d2314d14fb64bda287d25d9ef12b...@exchange1.cps.local> -To: "'zzzzte...@yahoogroups.com'" <zzzzte...@yahoogroups.com> -X-Mailer: Internet Mail Service (5.5.2653.19) -X-Egroups-From: Steve Burt <steve.b...@cursor-system.com> -From: Steve Burt <steve_b...@cursor-system.com> -X-Yahoo-Profile: pyruse -MIME-Version: 1.0 -Mailing-List: list zzzzte...@yahoogroups.com; contact - forteana-ow...@yahoogroups.com -Delivered-To: mailing list zzzzte...@yahoogroups.com -Precedence: bulk -List-Unsubscribe: <mailto:zzzzteana-unsubscr...@yahoogroups.com> -Date: Thu, 22 Aug 2002 12:46:18 +0100 -Subject: [zzzzteana] RE: Alexander -Reply-To: zzzzte...@yahoogroups.com -Content-Type: text/plain; charset=US-ASCII -Content-Transfer-Encoding: 7bit - -Martin A posted: -Tassos Papadopoulos, the Greek sculptor behind the plan, judged that the - limestone of Mount Kerdylio, 70 miles east of Salonika and not far from the - Mount Athos monastic community, was ideal for the patriotic sculpture. - - As well as Alexander's granite features, 240 ft high and 170 ft wide, a - museum, a restored amphitheatre and car park for admiring crowds are -planned ---------------------- -So is this mountain limestone or granite? -If it's limestone, it'll weather pretty fast. - ------------------------- Yahoo! Groups Sponsor ---------------------~--> -4 DVDs Free +s&p Join Now -http://us.click.yahoo.com/pt6YBB/NXiEAA/mG3HAA/7gSolB/TM ----------------------------------------------------------------------~-> - -To unsubscribe from this group, send an email to: -forteana-unsubscr...@egroups.com - - - -Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/ - - - http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/spamassassin_db/ham/ham3 ---------------------------------------------------------------------- diff --git a/server/container/util/src/test/resources/spamassassin_db/ham/ham3 b/server/container/util/src/test/resources/spamassassin_db/ham/ham3 deleted file mode 100644 index c7cfbc8..0000000 --- a/server/container/util/src/test/resources/spamassassin_db/ham/ham3 +++ /dev/null @@ -1,82 +0,0 @@ -From t...@2ubh.com Thu Aug 22 13:52:59 2002 -Return-Path: <t...@2ubh.com> -Delivered-To: z...@localhost.netnoteinc.com -Received: from localhost (localhost [127.0.0.1]) - by phobos.labs.netnoteinc.com (Postfix) with ESMTP id 0314547C66 - for <zzzz@localhost>; Thu, 22 Aug 2002 08:52:58 -0400 (EDT) -Received: from phobos [127.0.0.1] - by localhost with IMAP (fetchmail-5.9.0) - for zzzz@localhost (single-drop); Thu, 22 Aug 2002 13:52:59 +0100 (IST) -Received: from n16.grp.scd.yahoo.com (n16.grp.scd.yahoo.com - [66.218.66.71]) by dogma.slashnull.org (8.11.6/8.11.6) with SMTP id - g7MCrdZ07070 for <z...@spamassassin.taint.org>; Thu, 22 Aug 2002 13:53:39 +0100 -X-Egroups-Return: sentto-2242572-52733-1030020820-zzzz=spamassassin.taint....@returns.groups.yahoo.com -Received: from [66.218.67.198] by n16.grp.scd.yahoo.com with NNFMP; - 22 Aug 2002 12:53:40 -0000 -X-Sender: t...@2ubh.com -X-Apparently-To: zzzzte...@yahoogroups.com -Received: (EGP: mail-8_1_0_1); 22 Aug 2002 12:53:39 -0000 -Received: (qmail 76099 invoked from network); 22 Aug 2002 12:53:39 -0000 -Received: from unknown (66.218.66.218) by m5.grp.scd.yahoo.com with QMQP; - 22 Aug 2002 12:53:39 -0000 -Received: from unknown (HELO rhenium.btinternet.com) (194.73.73.93) by - mta3.grp.scd.yahoo.com with SMTP; 22 Aug 2002 12:53:39 -0000 -Received: from host217-36-23-185.in-addr.btopenworld.com ([217.36.23.185]) - by rhenium.btinternet.com with esmtp (Exim 3.22 #8) id 17hrT0-0004gj-00 - for forte...@yahoogroups.com; Thu, 22 Aug 2002 13:53:38 +0100 -X-Mailer: Microsoft Outlook Express Macintosh Edition - 4.5 (0410) -To: zzzzteana <zzzzte...@yahoogroups.com> -X-Priority: 3 -Message-Id: <e17hrt0-0004gj...@rhenium.btinternet.com> -From: "Tim Chapman" <t...@2ubh.com> -X-Yahoo-Profile: tim2ubh -MIME-Version: 1.0 -Mailing-List: list zzzzte...@yahoogroups.com; contact - forteana-ow...@yahoogroups.com -Delivered-To: mailing list zzzzte...@yahoogroups.com -Precedence: bulk -List-Unsubscribe: <mailto:zzzzteana-unsubscr...@yahoogroups.com> -Date: Thu, 22 Aug 2002 13:52:38 +0100 -Subject: [zzzzteana] Moscow bomber -Reply-To: zzzzte...@yahoogroups.com -Content-Type: text/plain; charset=US-ASCII -Content-Transfer-Encoding: 7bit - -Man Threatens Explosion In Moscow - -Thursday August 22, 2002 1:40 PM -MOSCOW (AP) - Security officers on Thursday seized an unidentified man who -said he was armed with explosives and threatened to blow up his truck in -front of Russia's Federal Security Services headquarters in Moscow, NTV -television reported. -The officers seized an automatic rifle the man was carrying, then the man -got out of the truck and was taken into custody, NTV said. No other details -were immediately available. -The man had demanded talks with high government officials, the Interfax and -ITAR-Tass news agencies said. Ekho Moskvy radio reported that he wanted to -talk with Russian President Vladimir Putin. -Police and security forces rushed to the Security Service building, within -blocks of the Kremlin, Red Square and the Bolshoi Ballet, and surrounded the -man, who claimed to have one and a half tons of explosives, the news -agencies said. Negotiations continued for about one and a half hours outside -the building, ITAR-Tass and Interfax reported, citing witnesses. -The man later drove away from the building, under police escort, and drove -to a street near Moscow's Olympic Penta Hotel, where authorities held -further negotiations with him, the Moscow police press service said. The -move appeared to be an attempt by security services to get him to a more -secure location. - ------------------------- Yahoo! Groups Sponsor ---------------------~--> -4 DVDs Free +s&p Join Now -http://us.click.yahoo.com/pt6YBB/NXiEAA/mG3HAA/7gSolB/TM ----------------------------------------------------------------------~-> - -To unsubscribe from this group, send an email to: -forteana-unsubscr...@egroups.com - - - -Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/ - - - http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/spamassassin_db/ham/ham4 ---------------------------------------------------------------------- diff --git a/server/container/util/src/test/resources/spamassassin_db/ham/ham4 b/server/container/util/src/test/resources/spamassassin_db/ham/ham4 deleted file mode 100644 index 9a726c2..0000000 --- a/server/container/util/src/test/resources/spamassassin_db/ham/ham4 +++ /dev/null @@ -1,78 +0,0 @@ -From irregulars-ad...@tb.tf Thu Aug 22 14:23:39 2002 -Return-Path: <irregulars-ad...@tb.tf> -Delivered-To: z...@localhost.netnoteinc.com -Received: from localhost (localhost [127.0.0.1]) - by phobos.labs.netnoteinc.com (Postfix) with ESMTP id 9DAE147C66 - for <zzzz@localhost>; Thu, 22 Aug 2002 09:23:38 -0400 (EDT) -Received: from phobos [127.0.0.1] - by localhost with IMAP (fetchmail-5.9.0) - for zzzz@localhost (single-drop); Thu, 22 Aug 2002 14:23:38 +0100 (IST) -Received: from web.tb.tf (route-64-131-126-36.telocity.com - [64.131.126.36]) by dogma.slashnull.org (8.11.6/8.11.6) with ESMTP id - g7MDGOZ07922 for <zzzz-...@spamassassin.taint.org>; Thu, 22 Aug 2002 14:16:24 +0100 -Received: from web.tb.tf (localhost.localdomain [127.0.0.1]) by web.tb.tf - (8.11.6/8.11.6) with ESMTP id g7MDP9I16418; Thu, 22 Aug 2002 09:25:09 - -0400 -Received: from red.harvee.home (red [192.168.25.1] (may be forged)) by - web.tb.tf (8.11.6/8.11.6) with ESMTP id g7MDO4I16408 for - <irregul...@tb.tf>; Thu, 22 Aug 2002 09:24:04 -0400 -Received: from prserv.net (out4.prserv.net [32.97.166.34]) by - red.harvee.home (8.11.6/8.11.6) with ESMTP id g7MDFBD29237 for - <irregul...@tb.tf>; Thu, 22 Aug 2002 09:15:12 -0400 -Received: from [209.202.248.109] - (slip-32-103-249-10.ma.us.prserv.net[32.103.249.10]) by prserv.net (out4) - with ESMTP id <2002082213150220405qu8jce>; Thu, 22 Aug 2002 13:15:07 +0000 -MIME-Version: 1.0 -X-Sender: @ (Unverified) -Message-Id: <p04330137b98a941c58a8@[209.202.248.109]> -To: undisclosed-recipient: ; -From: Monty Solomon <mo...@roscom.com> -Content-Type: text/plain; charset="us-ascii" -Subject: [IRR] Klez: The Virus That Won't Die -Sender: irregulars-ad...@tb.tf -Errors-To: irregulars-ad...@tb.tf -X-Beenthere: irregul...@tb.tf -X-Mailman-Version: 2.0.6 -Precedence: bulk -List-Help: <mailto:irregulars-requ...@tb.tf?subject=help> -List-Post: <mailto:irregul...@tb.tf> -List-Subscribe: <http://tb.tf/mailman/listinfo/irregulars>, - <mailto:irregulars-requ...@tb.tf?subject=subscribe> -List-Id: New home of the TBTF Irregulars mailing list <irregulars.tb.tf> -List-Unsubscribe: <http://tb.tf/mailman/listinfo/irregulars>, - <mailto:irregulars-requ...@tb.tf?subject=unsubscribe> -List-Archive: <http://tb.tf/mailman/private/irregulars/> -Date: Thu, 22 Aug 2002 09:15:25 -0400 - -Klez: The Virus That Won't Die - -Already the most prolific virus ever, Klez continues to wreak havoc. - -Andrew Brandt ->>From the September 2002 issue of PC World magazine -Posted Thursday, August 01, 2002 - - -The Klez worm is approaching its seventh month of wriggling across -the Web, making it one of the most persistent viruses ever. And -experts warn that it may be a harbinger of new viruses that use a -combination of pernicious approaches to go from PC to PC. - -Antivirus software makers Symantec and McAfee both report more than -2000 new infections daily, with no sign of letup at press time. The -British security firm MessageLabs estimates that 1 in every 300 -e-mail messages holds a variation of the Klez virus, and says that -Klez has already surpassed last summer's SirCam as the most prolific -virus ever. - -And some newer Klez variants aren't merely nuisances--they can carry -other viruses in them that corrupt your data. - -... - -http://www.pcworld.com/news/article/0,aid,103259,00.asp -_______________________________________________ -Irregulars mailing list -irregul...@tb.tf -http://tb.tf/mailman/listinfo/irregulars - http://git-wip-us.apache.org/repos/asf/james-project/blob/1fd63a7f/server/container/util/src/test/resources/spamassassin_db/ham/ham5 ---------------------------------------------------------------------- diff --git a/server/container/util/src/test/resources/spamassassin_db/ham/ham5 b/server/container/util/src/test/resources/spamassassin_db/ham/ham5 deleted file mode 100644 index 57b6801..0000000 --- a/server/container/util/src/test/resources/spamassassin_db/ham/ham5 +++ /dev/null @@ -1,77 +0,0 @@ -From stewart.sm...@ee.ed.ac.uk Thu Aug 22 14:44:26 2002 -Return-Path: <stewart.sm...@ee.ed.ac.uk> -Delivered-To: z...@localhost.netnoteinc.com -Received: from localhost (localhost [127.0.0.1]) - by phobos.labs.netnoteinc.com (Postfix) with ESMTP id EC69D47C66 - for <zzzz@localhost>; Thu, 22 Aug 2002 09:44:25 -0400 (EDT) -Received: from phobos [127.0.0.1] - by localhost with IMAP (fetchmail-5.9.0) - for zzzz@localhost (single-drop); Thu, 22 Aug 2002 14:44:25 +0100 (IST) -Received: from n6.grp.scd.yahoo.com (n6.grp.scd.yahoo.com [66.218.66.90]) - by dogma.slashnull.org (8.11.6/8.11.6) with SMTP id g7MDcOZ08504 for - <z...@spamassassin.taint.org>; Thu, 22 Aug 2002 14:38:25 +0100 -X-Egroups-Return: sentto-2242572-52736-1030023506-zzzz=spamassassin.taint....@returns.groups.yahoo.com -Received: from [66.218.67.192] by n6.grp.scd.yahoo.com with NNFMP; - 22 Aug 2002 13:38:26 -0000 -X-Sender: stewart.sm...@ee.ed.ac.uk -X-Apparently-To: zzzzte...@yahoogroups.com -Received: (EGP: mail-8_1_0_1); 22 Aug 2002 13:38:25 -0000 -Received: (qmail 48882 invoked from network); 22 Aug 2002 13:38:25 -0000 -Received: from unknown (66.218.66.218) by m10.grp.scd.yahoo.com with QMQP; - 22 Aug 2002 13:38:25 -0000 -Received: from unknown (HELO postbox.ee.ed.ac.uk) (129.215.80.253) by - mta3.grp.scd.yahoo.com with SMTP; 22 Aug 2002 13:38:24 -0000 -Received: from ee.ed.ac.uk (sxs@dunblane [129.215.34.86]) by - postbox.ee.ed.ac.uk (8.11.0/8.11.0) with ESMTP id g7MDcNi28645 for - <forte...@yahoogroups.com>; Thu, 22 Aug 2002 14:38:23 +0100 (BST) -Message-Id: <3d64e94e.8060...@ee.ed.ac.uk> -Organization: Scottish Microelectronics Centre -User-Agent: Mozilla/5.0 (X11; U; SunOS sun4u; en-US; rv:1.1b) Gecko/20020628 -X-Accept-Language: en, en-us -To: zzzzte...@yahoogroups.com -References: <3D64F325.11319.61EA648@localhost> -From: Stewart Smith <stewart.sm...@ee.ed.ac.uk> -X-Yahoo-Profile: stochasticus -MIME-Version: 1.0 -Mailing-List: list zzzzte...@yahoogroups.com; contact - forteana-ow...@yahoogroups.com -Delivered-To: mailing list zzzzte...@yahoogroups.com -Precedence: bulk -List-Unsubscribe: <mailto:zzzzteana-unsubscr...@yahoogroups.com> -Date: Thu, 22 Aug 2002 14:38:22 +0100 -Subject: Re: [zzzzteana] Nothing like mama used to make -Reply-To: zzzzte...@yahoogroups.com -Content-Type: text/plain; charset=US-ASCII -Content-Transfer-Encoding: 7bit - -> in adding cream to spaghetti carbonara, which has the same effect on pasta as -> making a pizza a deep-pie; - -I just had to jump in here as Carbonara is one of my favourites to make and ask -what the hell are you supposed to use instead of cream? I've never seen a -recipe that hasn't used this. Personally I use low fat creme fraiche because it -works quite nicely but the only time I've seen an supposedly authentic recipe -for carbonara it was identical to mine (cream, eggs and lots of fresh parmesan) -except for the creme fraiche. - -Stew --- -Stewart Smith -Scottish Microelectronics Centre, University of Edinburgh. -http://www.ee.ed.ac.uk/~sxs/ - - ------------------------- Yahoo! Groups Sponsor ---------------------~--> -4 DVDs Free +s&p Join Now -http://us.click.yahoo.com/pt6YBB/NXiEAA/mG3HAA/7gSolB/TM ----------------------------------------------------------------------~-> - -To unsubscribe from this group, send an email to: -forteana-unsubscr...@egroups.com - - - -Your use of Yahoo! Groups is subject to http://docs.yahoo.com/info/terms/ - - - --------------------------------------------------------------------- To unsubscribe, e-mail: server-dev-unsubscr...@james.apache.org For additional commands, e-mail: server-dev-h...@james.apache.org