1 /**************************************************************** 2 * Licensed to the Apache Software Foundation (ASF) under one * 3 * or more contributor license agreements. See the NOTICE file * 4 * distributed with this work for additional information * 5 * regarding copyright ownership. The ASF licenses this file * 6 * to you under the Apache License, Version 2.0 (the * 7 * "License"); you may not use this file except in compliance * 8 * with the License. You may obtain a copy of the License at * 9 * * 10 * http://www.apache.org/licenses/LICENSE-2.0 * 11 * * 12 * Unless required by applicable law or agreed to in writing, * 13 * software distributed under the License is distributed on an * 14 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * 15 * KIND, either express or implied. See the License for the * 16 * specific language governing permissions and limitations * 17 * under the License. * 18 ****************************************************************/ 19 20 21 22 package org.apache.james.transport.matchers; 23 24 import org.apache.mailet.base.GenericMatcher; 25 import org.apache.mailet.Mail; 26 27 import javax.mail.MessagingException; 28 import javax.mail.internet.MimeMessage; 29 import java.util.Collection; 30 31 /** 32 * <p>This matcher tests for the Hebeas Warrant Mark. 33 * For details see: http://www.hebeas.com</p> 34 * 35 * <p>Usage: Place this matcher</p> 36 * <pre><code> 37 * <mailet match="HasHabeasWarrantMark" class="ToProcessor"> 38 * <processor> transport </processor> 39 * </mailet> 40 * </code></pre> 41 * <p>in the root processs before the DNSRBL block lists (the InSpammerBlacklist matcher).</p> 42 * 43 * <p>Because the Habeas Warrant Mark is copyright material, I have asked for and 44 * received the following explicit statement from Habeas:</p> 45 * <pre> 46 * ----------------------------------- 47 * From: Lindsey Pettit [mailto:support@habeas.com] 48 * Sent: Sunday, September 29, 2002 5:51 49 * To: Noel J. Bergman 50 * Subject: RE: Habeas and Apache James 51 * 52 * Dear Noel, 53 * 54 * > I guess that since your Warrant Mark is copyright, I should ask for 55 * > something from you to explicitly authorize that Hebeas will permit 56 * > this code to be included and distributed as part of Apache James 57 * > under the Apache Software License. As we have established, the use 58 * > of the Habeas Warrant Mark for filtering is not restricted, but I 59 * > would like something to confirm that, so that Apache will be happy. 60 * 61 * I can hereby confirm to you that there is no license necessary in 62 * order to use the Habeas mark for filtering. That said, however, we 63 * do insist that it not ever be used as a basis for rejecting email which 64 * bears the Habeas mark. 65 * ----------------------------------- 66 * </pre> 67 */ 68 69 public class HasHabeasWarrantMark extends GenericMatcher 70 { 71 public static final String[][] warrantMark = 72 { 73 { "X-Habeas-SWE-1", "winter into spring" }, 74 { "X-Habeas-SWE-2", "brightly anticipated" }, 75 { "X-Habeas-SWE-3", "like Habeas SWE (tm)" }, 76 { "X-Habeas-SWE-4", "Copyright 2002 Habeas (tm)" }, 77 { "X-Habeas-SWE-5", "Sender Warranted Email (SWE) (tm). The sender of this" }, 78 { "X-Habeas-SWE-6", "email in exchange for a license for this Habeas" }, 79 { "X-Habeas-SWE-7", "warrant mark warrants that this is a Habeas Compliant" }, 80 { "X-Habeas-SWE-8", "Message (HCM) and not spam. Please report use of this" }, 81 { "X-Habeas-SWE-9", "mark in spam to <http://www.habeas.com/report/>." }, 82 }; 83 84 public Collection match(Mail mail) throws MessagingException 85 { 86 MimeMessage message = mail.getMessage(); 87 88 //Loop through all the patterns 89 for (int i = 0; i < warrantMark.length; i++) try 90 { 91 String headerName = warrantMark[i][0]; //Get the header name 92 String requiredValue = warrantMark[i][1]; //Get the required value 93 String headerValue = message.getHeader(headerName, null); //Get the header value(s) 94 95 // We want an exact match, so only test the first value. 96 // If there are multiple values, the header may be 97 // (illegally) forged. I'll leave it as an exercise to 98 // others if they want to detect and report potentially 99 // forged headers. 100 101 if (!(requiredValue.equals(headerValue))) return null; 102 } 103 catch (Exception e) 104 { 105 log(e.toString()); 106 return null; //if we get an exception, don't validate the mark 107 } 108 109 // If we get here, all headers are present and match. 110 return mail.getRecipients(); 111 } 112 113 /* 114 * Returns information about the matcher, such as author, version, and copyright. 115 * <p> 116 * The string that this method returns should be plain text and not markup 117 * of any kind (such as HTML, XML, etc.). 118 * 119 * @return a String containing matcher information 120 */ 121 122 public String getMatcherInfo() 123 { 124 return "Habeas Warrant Mark Matcher (see http://www.habeas.com for details)."; 125 } 126 } 127