1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.james.jspf.policies.local;
21
22 import org.apache.james.jspf.core.DNSLookupContinuation;
23 import org.apache.james.jspf.core.Logger;
24 import org.apache.james.jspf.core.MacroExpand;
25 import org.apache.james.jspf.core.SPF1Constants;
26 import org.apache.james.jspf.core.SPF1Record;
27 import org.apache.james.jspf.core.SPF1Utils;
28 import org.apache.james.jspf.core.SPFChecker;
29 import org.apache.james.jspf.core.SPFSession;
30 import org.apache.james.jspf.core.exceptions.NeutralException;
31 import org.apache.james.jspf.core.exceptions.NoneException;
32 import org.apache.james.jspf.core.exceptions.PermErrorException;
33 import org.apache.james.jspf.core.exceptions.TempErrorException;
34 import org.apache.james.jspf.policies.PolicyPostFilter;
35
36
37
38
39 public final class DefaultExplanationPolicy implements PolicyPostFilter {
40
41
42 private final class ExplanationChecker implements SPFChecker {
43
44
45
46
47 public DNSLookupContinuation checkSPF(SPFSession spfData)
48 throws PermErrorException,
49 NoneException, TempErrorException,
50 NeutralException {
51 String attExplanation = (String) spfData.getAttribute(ATTRIBUTE_DEFAULT_EXPLANATION_POLICY_EXPLANATION);
52 try {
53 String explanation = macroExpand.expand(attExplanation, spfData, MacroExpand.EXPLANATION);
54
55 spfData.setExplanation(explanation);
56 } catch (PermErrorException e) {
57
58 log.debug("Invalid defaulfExplanation: " + attExplanation);
59 }
60 return null;
61 }
62 }
63
64 private final class DefaultExplanationChecker implements SPFChecker {
65
66 private SPFChecker explanationCheckr = new ExplanationChecker();
67
68
69
70
71 public DNSLookupContinuation checkSPF(SPFSession spfData) throws PermErrorException, NoneException, TempErrorException, NeutralException {
72
73 if (SPF1Constants.FAIL.equals(spfData.getCurrentResult())) {
74 if (spfData.getExplanation()==null || spfData.getExplanation().equals("")) {
75 String explanation;
76 if (defExplanation == null) {
77 explanation = SPF1Utils.DEFAULT_EXPLANATION;
78 } else {
79 explanation = defExplanation;
80 }
81 spfData.setAttribute(ATTRIBUTE_DEFAULT_EXPLANATION_POLICY_EXPLANATION, explanation);
82 spfData.pushChecker(explanationCheckr);
83 return macroExpand.checkExpand(explanation, spfData, MacroExpand.EXPLANATION);
84 }
85 }
86
87 return null;
88 }
89
90 public String toString() {
91 if (defExplanation == null) {
92 return "defaultExplanation";
93 } else {
94 return "defaultExplanation="+defExplanation;
95 }
96 }
97 }
98
99 private static final String ATTRIBUTE_DEFAULT_EXPLANATION_POLICY_EXPLANATION = "DefaultExplanationPolicy.explanation";
100
101
102
103
104 private Logger log;
105
106
107
108 private String defExplanation;
109
110 private MacroExpand macroExpand;
111
112
113
114
115
116
117 public DefaultExplanationPolicy(Logger log, String explanation, MacroExpand macroExpand) {
118 this.log = log;
119 this.defExplanation = explanation;
120 this.macroExpand = macroExpand;
121 }
122
123
124
125
126 public SPF1Record getSPFRecord(String currentDomain, SPF1Record spfRecord) throws PermErrorException, TempErrorException, NoneException, NeutralException {
127 if (spfRecord == null) return null;
128
129 spfRecord.getModifiers().add(new DefaultExplanationChecker());
130 return spfRecord;
131 }
132 }