1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 package org.apache.commons.validator;
18
19 import java.util.regex.Matcher;
20 import java.util.regex.Pattern;
21
22 import org.apache.commons.validator.routines.InetAddressValidator;
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43 @Deprecated
44 public class EmailValidator {
45
46 private static final String SPECIAL_CHARS = "\\p{Cntrl}\\(\\)<>@,;:'\\\\\\\"\\.\\[\\]";
47 private static final String VALID_CHARS = "[^\\s" + SPECIAL_CHARS + "]";
48 private static final String QUOTED_USER = "(\"[^\"]*\")";
49 private static final String ATOM = VALID_CHARS + '+';
50 private static final String WORD = "((" + VALID_CHARS + "|')+|" + QUOTED_USER + ")";
51
52
53
54 private static final Pattern IP_DOMAIN_PATTERN = Pattern.compile("^\\[(.*)\\]$");
55 private static final Pattern TLD_PATTERN = Pattern.compile("^([a-zA-Z]+)$");
56
57 private static final Pattern USER_PATTERN = Pattern.compile("^\\s*" + WORD + "(\\." + WORD + ")*$");
58 private static final Pattern DOMAIN_PATTERN = Pattern.compile("^" + ATOM + "(\\." + ATOM + ")*\\s*$");
59 private static final Pattern ATOM_PATTERN = Pattern.compile("(" + ATOM + ")");
60
61
62
63
64 private static final EmailValidator EMAIL_VALIDATOR = new EmailValidator();
65
66
67
68
69
70 public static EmailValidator getInstance() {
71 return EMAIL_VALIDATOR;
72 }
73
74
75
76
77 protected EmailValidator() {
78 }
79
80
81
82
83
84
85
86
87 public boolean isValid(final String email) {
88 return org.apache.commons.validator.routines.EmailValidator.getInstance().isValid(email);
89 }
90
91
92
93
94
95
96 protected boolean isValidDomain(final String domain) {
97 boolean symbolic = false;
98
99
100 final Matcher ipDomainMatcher = IP_DOMAIN_PATTERN.matcher(domain);
101
102 if (ipDomainMatcher.matches()) {
103 final InetAddressValidator inetAddressValidator =
104 InetAddressValidator.getInstance();
105 if (inetAddressValidator.isValid(ipDomainMatcher.group(1))) {
106 return true;
107 }
108 } else {
109
110 symbolic = DOMAIN_PATTERN.matcher(domain).matches();
111 }
112
113 if (!symbolic) {
114 return false;
115 }
116 if (!isValidSymbolicDomain(domain)) {
117 return false;
118 }
119
120 return true;
121 }
122
123
124
125
126
127
128 protected boolean isValidIpAddress(final String ipAddress) {
129 final Matcher ipAddressMatcher = IP_DOMAIN_PATTERN.matcher(ipAddress);
130 for (int i = 1; i <= 4; i++) {
131 final String ipSegment = ipAddressMatcher.group(i);
132 if (ipSegment == null || ipSegment.isEmpty()) {
133 return false;
134 }
135
136 int iIpSegment = 0;
137
138 try {
139 iIpSegment = Integer.parseInt(ipSegment);
140 } catch (final NumberFormatException e) {
141 return false;
142 }
143
144 if (iIpSegment > 255) {
145 return false;
146 }
147
148 }
149 return true;
150 }
151
152
153
154
155
156
157 protected boolean isValidSymbolicDomain(String domain) {
158 final String[] domainSegment = new String[10];
159 boolean match = true;
160 int i = 0;
161 final Matcher atomMatcher = ATOM_PATTERN.matcher(domain);
162 while (match) {
163 match = atomMatcher.matches();
164 if (match) {
165 domainSegment[i] = atomMatcher.group(1);
166 final int l = domainSegment[i].length() + 1;
167 domain =
168 l >= domain.length()
169 ? ""
170 : domain.substring(l);
171
172 i++;
173 }
174 }
175
176 final int len = i;
177
178
179 if (len < 2) {
180 return false;
181 }
182
183 final String tld = domainSegment[len - 1];
184 if (tld.length() <= 1) {
185 return false;
186 }
187 if (! TLD_PATTERN.matcher(tld).matches()) {
188 return false;
189 }
190
191 return true;
192 }
193
194
195
196
197
198
199 protected boolean isValidUser(final String user) {
200 return USER_PATTERN.matcher(user).matches();
201 }
202
203
204
205
206
207
208
209
210 protected String stripComments(final String emailStr) {
211 String result = emailStr;
212 final String commentPat = "^((?:[^\"\\\\]|\\\\.)*(?:\"(?:[^\"\\\\]|\\\\.)*\"(?:[^\"\\\\]|\111111\\\\.)*)*)\\((?:[^()\\\\]|\\\\.)*\\)/";
213 final Pattern commentMatcher = Pattern.compile(commentPat);
214
215 while (commentMatcher.matcher(result).matches()) {
216 result = result.replaceFirst(commentPat, "\1 ");
217 }
218 return result;
219 }
220 }