summaryrefslogtreecommitdiff
path: root/src/main/java/com/mesasoft/cn/util/ValidationUtils.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/mesasoft/cn/util/ValidationUtils.java')
-rw-r--r--src/main/java/com/mesasoft/cn/util/ValidationUtils.java202
1 files changed, 202 insertions, 0 deletions
diff --git a/src/main/java/com/mesasoft/cn/util/ValidationUtils.java b/src/main/java/com/mesasoft/cn/util/ValidationUtils.java
new file mode 100644
index 0000000..013008e
--- /dev/null
+++ b/src/main/java/com/mesasoft/cn/util/ValidationUtils.java
@@ -0,0 +1,202 @@
+package com.mesasoft.cn.util;
+
+import com.mesasoft.cn.sketch.api.BrightCloud;
+import com.mesasoft.cn.sketch.config.ApplicationConfig;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.log4j.Logger;
+import sun.net.util.IPAddressUtil;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.InputStreamReader;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Objects;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public class ValidationUtils {
+ private static final Logger LOG = Logger.getLogger(ValidationUtils.class);
+
+ /**
+ * 获取二级域名
+ **/
+ public static String getSecDomain(String fqdnOrUrl){
+ String filePath = Objects.requireNonNull(BrightCloud.class.getClassLoader()
+ .getResource(ApplicationConfig.TLD_FILE)).getFile();
+ HashMap<String, HashMap<String, String>> maps = readTopDomainFile(filePath);
+ try {
+ String[] split = fqdnOrUrl.split("\\.");
+ String secDomain = null;
+ for (int i = split.length - 1; i >= 0; i--) {
+ int maps_index = split.length - (i + 1);
+ HashMap<String, String> innerMap = maps.get("map_id_" + maps_index);
+ HashMap<String, String> fullTop = maps.get("full");
+ if (!(innerMap.containsKey(split[i]))) {
+ String strSec = "";
+ for (int j = i; j < split.length; j++) {
+ strSec += (split[j] + ".");
+ }
+ secDomain = strSec.substring(0, strSec.length() - 1);
+ if (fullTop.containsKey(getTopFromSecDomain(secDomain))) {
+ break;
+ } else {
+ while (!fullTop.containsKey(getTopFromSecDomain(secDomain)) && getTopFromSecDomain(secDomain).contains(".")) {
+ secDomain = getTopFromSecDomain(secDomain);
+ }
+ break;
+ }
+ }
+ }
+ // 右匹配为顶级域名
+ if (secDomain == null){
+ secDomain = fqdnOrUrl;
+ }
+ return secDomain;
+ } catch (Exception e) {
+ LOG.error("urlDomain:" + fqdnOrUrl);
+ e.printStackTrace();
+ return "---no---return---";
+ }
+ }
+
+ public static List<String> getSecDomain(List<String> fqdnOrUrls) {
+ HashMap<String, HashMap<String, String>> maps = readTopDomainFile(ApplicationConfig.TLD_FILE);
+ List<String> secDomainList = new ArrayList<>();
+ for (String oriDomain : fqdnOrUrls) {
+ String secDomain = getSecDomain(oriDomain);
+ if (StringUtils.isNotBlank(secDomain) && !("---no---return---".equals(secDomain))) {
+ secDomainList.add(secDomain);
+ } else {
+ System.out.println(oriDomain);
+ }
+ }
+ return secDomainList;
+ }
+
+ public static String getTopFromSecDomain(String secDomain) {
+ String quFirstDian = secDomain;
+ if (secDomain.contains(".")) {
+ quFirstDian = secDomain.substring(secDomain.indexOf(".")).substring(1);
+ }
+ return quFirstDian;
+ }
+
+ public static HashMap<String, HashMap<String, String>> readTopDomainFile(String filePath) {
+ HashMap<String, HashMap<String, String>> maps = makeHashMap(filePath);
+ try {
+ String encoding = "UTF-8";
+ File file = new File(filePath);
+ if (file.isFile() && file.exists()) {
+ InputStreamReader read = new InputStreamReader(
+ new FileInputStream(file), encoding);
+ BufferedReader bufferedReader = new BufferedReader(read);
+ String lineTxt = null;
+ while ((lineTxt = bufferedReader.readLine()) != null) {
+ HashMap<String, String> fullTop = maps.get("full");
+ fullTop.put(lineTxt, lineTxt);
+ maps.put("full", fullTop);
+ String[] split = lineTxt.split("\\.");
+ for (int i = split.length - 1; i >= 0; i--) {
+ int maps_index = split.length - (i + 1);
+ HashMap<String, String> innerMap = maps.get("map_id_" + maps_index);
+ innerMap.put(split[i], split[i]);
+ maps.put("map_id_" + maps_index, innerMap);
+ }
+ }
+ read.close();
+ } else {
+ LOG.error("TopDomainUtils>=>readTopDomainFile filePath is wrong--->{" + filePath + "}<---");
+ }
+ } catch (Exception e) {
+ LOG.error("TopDomainUtils>=>readTopDomainFile get filePathData error--->{" + e + "}<---");
+ e.printStackTrace();
+ }
+ return maps;
+ }
+
+ public static HashMap<String, HashMap<String, String>> makeHashMap(String filePath) {
+ int maxLength = FileUtils.getMaxLength(filePath);
+ HashMap<String, HashMap<String, String>> maps = new HashMap<String, HashMap<String, String>>();
+ for (int i = 0; i < maxLength; i++) {
+ maps.put("map_id_" + i, new HashMap<String, String>());
+ }
+ maps.put("full", new HashMap<String, String>());
+ return maps;
+ }
+
+ public static List<String> getChecked(List<String> objectList, String type){
+ if (type.equals("ip")){
+ return getCheckedIps(objectList);
+ }
+ if (type.equals("domain")){
+ return getCheckedFqdns(objectList);
+ }
+ LOG.error("Wrong type to be checked: " + type);
+ return objectList;
+ }
+
+ public static List<String> getCheckedFqdns(List<String> fqdns){
+ List<String> res = new ArrayList<>();
+ for (String fqdn:fqdns){
+ //去端口号
+ fqdn = fqdn.split(":")[0];
+ // 去重 & 校验
+ if (isValidDomain(fqdn) && !res.contains(fqdn)){
+ res.add(fqdn.toLowerCase());
+ } else {
+ LOG.debug("Bad or duplicated fqdn:" + fqdn);
+ }
+ }
+ return res;
+ }
+
+ public static List<String> getCheckedIps(List<String> ipList){
+ List<String> res = new ArrayList<>();
+ for (String ip:ipList){
+ //去端口号
+ ip = ip.split(":")[0];
+ // 去重 & 校验
+ if (isValidIp(ip) && !res.contains(ip)){
+ res.add(ip.toLowerCase());
+ } else {
+ LOG.debug("Bad or duplicated fqdn:" + ip);
+ }
+ }
+ return res;
+ }
+
+ public static boolean isValidIp(String ip){
+ boolean iPv4LiteralAddress = IPAddressUtil.isIPv4LiteralAddress(ip);
+ boolean iPv6LiteralAddress = IPAddressUtil.isIPv6LiteralAddress(ip);
+ return iPv4LiteralAddress || iPv6LiteralAddress;
+ }
+
+ private static boolean isValidDomain(String str)
+ {
+ String regex = "^((?!-)[A-Za-z0-9-_]"
+ + "{1,63}(?<!-)\\.)"
+ + "+[A-Za-z]{2,6}";
+ Pattern p = Pattern.compile(regex);
+
+ if (str == null) {
+ return false;
+ }
+ Matcher m = p.matcher(str);
+ return m.matches();
+ }
+
+ public static Integer getMatchPattern(String fqdn){
+ int match_pattern = 2;
+ if (fqdn.equals(getSecDomain(fqdn))){
+ match_pattern = 1; // 二级域名-右匹配
+ }
+ return match_pattern;
+ }
+
+
+
+
+}