001 /**************************************************************** 002 * Licensed to the Apache Software Foundation (ASF) under one * 003 * or more contributor license agreements. See the NOTICE file * 004 * distributed with this work for additional information * 005 * regarding copyright ownership. The ASF licenses this file * 006 * to you under the Apache License, Version 2.0 (the * 007 * "License"); you may not use this file except in compliance * 008 * with the License. You may obtain a copy of the License at * 009 * * 010 * http://www.apache.org/licenses/LICENSE-2.0 * 011 * * 012 * Unless required by applicable law or agreed to in writing, * 013 * software distributed under the License is distributed on an * 014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * 015 * KIND, either express or implied. See the License for the * 016 * specific language governing permissions and limitations * 017 * under the License. * 018 ****************************************************************/ 019 020 package org.apache.james.jspf.policies; 021 022 import org.apache.james.jspf.core.DNSLookupContinuation; 023 import org.apache.james.jspf.core.SPF1Record; 024 import org.apache.james.jspf.core.SPF1Utils; 025 import org.apache.james.jspf.core.SPFChecker; 026 import org.apache.james.jspf.core.SPFSession; 027 import org.apache.james.jspf.core.exceptions.NeutralException; 028 import org.apache.james.jspf.core.exceptions.NoneException; 029 import org.apache.james.jspf.core.exceptions.PermErrorException; 030 import org.apache.james.jspf.core.exceptions.TempErrorException; 031 import org.xbill.DNS.Name; 032 import org.xbill.DNS.TextParseException; 033 034 /** 035 * Run the checks on the validity of the domain 036 * This is an override filter to be executed as the first 037 * so it should be added as the last filter. 038 */ 039 public final class InitialChecksPolicy implements SPFChecker { 040 041 /** 042 * @see org.apache.james.jspf.core.SPFChecker#checkSPF(org.apache.james.jspf.core.SPFSession) 043 */ 044 public DNSLookupContinuation checkSPF(SPFSession spfData) 045 throws PermErrorException, TempErrorException, NeutralException, 046 NoneException { 047 SPF1Record res = (SPF1Record) spfData.getAttribute(SPF1Utils.ATTRIBUTE_SPF1_RECORD); 048 if (res == null) { 049 050 // Initial checks (spec 4.3) 051 String currentDomain = spfData.getCurrentDomain(); 052 if (currentDomain != null) { 053 String[] labels = currentDomain.split("\\."); 054 for (int i = 0; i < labels.length; i++) { 055 if (labels[i] != null && labels[i].length() > 63) { 056 throw new NoneException("Domain "+currentDomain+" is malformed (label longer than 63 characters)"); 057 } 058 } 059 } 060 061 if (spfData.getSenderDomain().indexOf('.') < 0) { 062 throw new NoneException("Sender domain "+spfData.getSenderDomain()+" is not an FQDN."); 063 } 064 065 try { 066 Name.fromString(spfData.getSenderDomain()); 067 } catch (TextParseException e) { 068 throw new NoneException("Invalid sender domain: "+e.getMessage()); 069 } 070 } 071 return null; 072 } 073 }