From 698ddfd1993915a17a8ede6f32e0c2f770009eeb Mon Sep 17 00:00:00 2001 From: Joern Muehlencord Date: Tue, 1 Mar 2022 08:53:41 +0100 Subject: [PATCH] improved whois --- .../network/whois/AbstractWhoisParser.java | 54 +++++++++---------- .../shared/network/whois/ArinWhoisParser.java | 4 ++ .../network/whois/DefaultWhoisParser.java | 19 +++++-- .../shared/network/whois/WhoisTest.java | 10 ++-- .../shared/network/187.50.136.210.txt | 48 +++++++++++++++++ 5 files changed, 100 insertions(+), 35 deletions(-) create mode 100644 network/src/test/resources/de/muehlencord/shared/network/187.50.136.210.txt diff --git a/network/src/main/java/de/muehlencord/shared/network/whois/AbstractWhoisParser.java b/network/src/main/java/de/muehlencord/shared/network/whois/AbstractWhoisParser.java index 6a84057..37857ae 100644 --- a/network/src/main/java/de/muehlencord/shared/network/whois/AbstractWhoisParser.java +++ b/network/src/main/java/de/muehlencord/shared/network/whois/AbstractWhoisParser.java @@ -1,4 +1,4 @@ -/* +/* * Copyright 2019 Joern Muehlencord (joern@muehlencord.de). * * Licensed under the Apache License, Version 2.0 (the "License"); @@ -19,38 +19,38 @@ import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** - * * @author Joern Muehlencord (joern@muehlencord.de) */ public abstract class AbstractWhoisParser implements WhoisParser { - protected Map getValueMap(String blockString) { - Map returnMap = new ConcurrentHashMap<>(); + protected Map getValueMap(String blockString) { + Map returnMap = new ConcurrentHashMap<>(); - String[] lines = blockString.split("\n"); - for (String line : lines) { - String key; - String value; - if (line.indexOf(" ") == -1) { - key = line; - value = ""; - } else { - key = line.substring(0, line.indexOf(" ")); - value = line.substring(line.indexOf(" ")); - value = value.trim(); - } - - returnMap.put(key, value); - } - - return returnMap; - } - - protected String getValue(String key, Map valueMap) { - if (valueMap.containsKey(key)) { - return valueMap.get(key); + String[] lines = blockString.split("\n"); + for (String line : lines) { + if (!line.startsWith("%")) { + String key; + String value; + if (line.indexOf(" ") == -1) { + key = line; + value = ""; } else { - return null; + key = line.substring(0, line.indexOf(" ")); + value = line.substring(line.indexOf(" ")); + value = value.trim(); } + returnMap.put(key, value); + } } + + return returnMap; + } + + protected String getValue(String key, Map valueMap) { + if (valueMap.containsKey(key)) { + return valueMap.get(key); + } else { + return null; + } + } } diff --git a/network/src/main/java/de/muehlencord/shared/network/whois/ArinWhoisParser.java b/network/src/main/java/de/muehlencord/shared/network/whois/ArinWhoisParser.java index 98ba65d..3d33342 100644 --- a/network/src/main/java/de/muehlencord/shared/network/whois/ArinWhoisParser.java +++ b/network/src/main/java/de/muehlencord/shared/network/whois/ArinWhoisParser.java @@ -49,6 +49,10 @@ public class ArinWhoisParser extends AbstractWhoisParser implements WhoisParser // if re-allocated just return empty whoisInformation because this RIR is not responsible if (whoisString.contains("Allocated to LACNIC")) { throw new WhoisException("Allocated to LACNIC"); + } else if (whoisString.contains ("NON-RIPE-NCC-MANAGED-ADDRESS-BLOCK")) { + throw new WhoisException("Not managed by RIPE"); + } else if (whoisString.contains ("This network range is not allocated to APNIC")) { + throw new WhoisException("Not allocated to APNIC"); } whoisInformation.setResponseString(whoisString); diff --git a/network/src/main/java/de/muehlencord/shared/network/whois/DefaultWhoisParser.java b/network/src/main/java/de/muehlencord/shared/network/whois/DefaultWhoisParser.java index a09a3d1..cd82313 100644 --- a/network/src/main/java/de/muehlencord/shared/network/whois/DefaultWhoisParser.java +++ b/network/src/main/java/de/muehlencord/shared/network/whois/DefaultWhoisParser.java @@ -18,6 +18,7 @@ package de.muehlencord.shared.network.whois; import static de.muehlencord.shared.network.CidrTool.rangeToCidrList; import java.util.Map; +import java.util.stream.Collectors; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -40,16 +41,18 @@ public class DefaultWhoisParser extends AbstractWhoisParser implements WhoisPars // if re-allocated just return empty whoisInformation because this RIR is not responsible if (whoisString.contains("Allocated to LACNIC")) { throw new WhoisException("Allocated to LACNIC"); + } else if (whoisString.contains ("NON-RIPE-NCC-MANAGED-ADDRESS-BLOCK")) { + throw new WhoisException("Not managed by RIPE"); + } else if (whoisString.contains ("This network range is not allocated to APNIC")) { + throw new WhoisException("Not allocated to APNIC"); } whoisInformation = new WhoisInformation(); whoisInformation.setResponseString(whoisString); // split by blank lines to identify blocks - String[] blocks; - if (whoisString.contains("\r\n")) { - blocks = whoisString.split("\r\n\r\n"); - } else { - blocks = whoisString.split("\n\n"); + String[] blocks = whoisString.split ("\\R\\R"); + if (blocks.length == 1) { + blocks = whoisString.lines().collect(Collectors.toList()).toArray(new String[0]); } for (String block : blocks) { analyseBlock(block); @@ -81,7 +84,13 @@ public class DefaultWhoisParser extends AbstractWhoisParser implements WhoisPars case "inetnum:": String inetnum = getValue("inetnum:", valueMap); String country = getValue("country:", valueMap); + if (country == null && block.contains (".br")) { + country = "BR"; + } String netname = getValue("netname:", valueMap); + if (netname == null) { + netname = getValue ("owner:", valueMap); + } String descr = getValue("descr:", valueMap); if ((inetnum == null) || (country == null)) { diff --git a/network/src/test/java/de/muehlencord/shared/network/whois/WhoisTest.java b/network/src/test/java/de/muehlencord/shared/network/whois/WhoisTest.java index bcc0f1e..6bc0c46 100644 --- a/network/src/test/java/de/muehlencord/shared/network/whois/WhoisTest.java +++ b/network/src/test/java/de/muehlencord/shared/network/whois/WhoisTest.java @@ -87,9 +87,13 @@ public class WhoisTest extends BaseTest { // whoIsClient.execute("whois.apnic.net", "182.72.111.26"); // whoIsClient.execute("whois.ripe.net", "213.55.95.62"); // Transferred to Afrinic // whoIsClient.execute("whois.afrinic.net", "213.55.95.62"); -// whoIsClient.execute("whois.arin.net", "32.64.68.229"); -// WhoisInformation info = whoIsClient.execute("whois.lacnic.net", "179.43.168.126"); - WhoisInformation info = whoIsClient.execute("179.43.168.126"); + // whoIsClient.execute("whois.arin.net", "32.64.68.229"); + + // WhoisInformation info = whoIsClient.execute("whois.lacnic.net", "179.43.168.126"); + // WhoisInformation info = whoIsClient.execute("143.198.77.103"); + // WhoisInformation info = whoIsClient.execute("179.43.168.126"); + WhoisInformation info = whoIsClient.execute("187.50.136.210"); + System.out.println (info); } diff --git a/network/src/test/resources/de/muehlencord/shared/network/187.50.136.210.txt b/network/src/test/resources/de/muehlencord/shared/network/187.50.136.210.txt new file mode 100644 index 0000000..c0e1837 --- /dev/null +++ b/network/src/test/resources/de/muehlencord/shared/network/187.50.136.210.txt @@ -0,0 +1,48 @@ +% Copyright (c) Nic.br +% The use of the data below is only permitted as described in +% full by the terms of use at https://registro.br/termo/en.html , +% being prohibited its distribution, commercialization or +% reproduction, in particular, to use it for advertising or +% any similar purpose. +% 2022-03-01T03:33:15-03:00 - IP: 88.198.54.68 + +inetnum: 187.50.0.0/15 +aut-num: AS10429 +abuse-c: CSTBR +owner: TELEF�NICA BRASIL S.A +ownerid: 02.558.157/0001-62 +responsible: Diretoria de Planejamento e Tecnologia +owner-c: ARITE +tech-c: GRP95 +inetrev: 187.50.136.0/24 +nserver: te-br-spo-tic-dns1.tdatabrasil.net.br +nsstat: 20220227 AA +nslastaa: 20220227 +nserver: te-br-spo-ib-dns2.tdatabrasil.net.br +nsstat: 20220227 AA +nslastaa: 20220227 +created: 20090313 +changed: 20190410 + +nic-hdl-br: ARITE +person: Administra��o Rede IP Telesp +created: 20080407 +changed: 20220104 + +nic-hdl-br: CSTBR +person: CSIRT TELEFONICA BR +created: 20180713 +changed: 20180713 + +nic-hdl-br: GRP95 +person: Grupo Provisionamento +created: 20031027 +changed: 20060809 + +% Security and mail abuse issues should also be addressed to +% cert.br, http://www.cert.br/ , respectivelly to cert@cert.br +% and mail-abuse@cert.br +% +% whois.registro.br accepts only direct match queries. Types +% of queries are: domain (.br), registrant (tax ID), ticket, +% provider, CIDR block, IP and ASN.^M