1 package net.sourceforge.pmd.rules.basic;
2
3 import java.net.InetAddress;
4 import java.util.regex.Pattern;
5
6 import net.sourceforge.pmd.AbstractJavaRule;
7 import net.sourceforge.pmd.ast.ASTLiteral;
8
9 public class AvoidUsingHardCodedIP extends AbstractJavaRule {
10
11 private static final String IPv4_REGEXP = "^\"[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\"$";
12 private static final String IPv6_REGEXP = "^\"[0-9a-fA-F:]+:[0-9a-fA-F]+\"$";
13 private static final String IPv4_MAPPED_IPv6_REGEXP = "^\"[0-9a-fA-F:]+:[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\"$";
14
15 private static final Pattern IPv4_PATTERM = Pattern.compile(IPv4_REGEXP);
16 private static final Pattern IPv6_PATTERM = Pattern.compile(IPv6_REGEXP);
17 private static final Pattern IPv4_MAPPED_IPv6_PATTERM = Pattern.compile(IPv4_MAPPED_IPv6_REGEXP);
18
19 /**
20 * This method checks if the Literal matches the pattern. If it does, a violation is logged.
21 */
22 public Object visit(ASTLiteral node, Object data) {
23 String image = node.getImage();
24 if (image == null || image.length() < 3 || image.charAt(0) != '"' ||
25 image.charAt(image.length()-1) != '"') {
26 return data;
27 }
28
29
30 char c = image.charAt(1);
31 if ((Character.isDigit(c) || c == ':') &&
32 (IPv4_PATTERM.matcher(image).matches() ||
33 IPv6_PATTERM.matcher(image).matches() ||
34 IPv4_MAPPED_IPv6_PATTERM.matcher(image).matches())) {
35 try {
36
37 InetAddress.getByName(image.substring(1, image.length()-1));
38
39
40 addViolation(data, node);
41 } catch (Exception e) {
42
43 }
44 }
45 return data;
46 }
47
48 }