dependency updates
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
/*
|
||||
/*
|
||||
* Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
@ -19,74 +19,77 @@ import static java.lang.Long.valueOf;
|
||||
import static java.lang.Math.floor;
|
||||
import static java.lang.Math.log;
|
||||
import static java.lang.Math.pow;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author Joern Muehlencord (joern@muehlencord.de)
|
||||
*/
|
||||
public class CidrTool {
|
||||
|
||||
public static List<String> rangeToCidrList(String startIp, String endIp) {
|
||||
long start = ipToLong(startIp);
|
||||
long end = ipToLong(endIp);
|
||||
|
||||
ArrayList<String> pairs = new ArrayList<>();
|
||||
while (end >= start) {
|
||||
byte maxsize = 32;
|
||||
while (maxsize > 0) {
|
||||
long mask = CIDR2MASK[ maxsize - 1];
|
||||
long maskedBase = start & mask;
|
||||
private static final int[] CIDR2MASK = new int[]{0x00000000, 0x80000000,
|
||||
0xC0000000, 0xE0000000, 0xF0000000, 0xF8000000, 0xFC000000,
|
||||
0xFE000000, 0xFF000000, 0xFF800000, 0xFFC00000, 0xFFE00000,
|
||||
0xFFF00000, 0xFFF80000, 0xFFFC0000, 0xFFFE0000, 0xFFFF0000,
|
||||
0xFFFF8000, 0xFFFFC000, 0xFFFFE000, 0xFFFFF000, 0xFFFFF800,
|
||||
0xFFFFFC00, 0xFFFFFE00, 0xFFFFFF00, 0xFFFFFF80, 0xFFFFFFC0,
|
||||
0xFFFFFFE0, 0xFFFFFFF0, 0xFFFFFFF8, 0xFFFFFFFC, 0xFFFFFFFE,
|
||||
0xFFFFFFFF};
|
||||
|
||||
if (maskedBase != start) {
|
||||
break;
|
||||
}
|
||||
private CidrTool() {
|
||||
// hide constructor
|
||||
}
|
||||
|
||||
maxsize--;
|
||||
}
|
||||
double x = log(end - start + 1) / log(2);
|
||||
byte maxdiff = (byte) (32 - floor(x));
|
||||
if (maxsize < maxdiff) {
|
||||
maxsize = maxdiff;
|
||||
}
|
||||
String ip = longToIP(start);
|
||||
pairs.add(ip + "/" + maxsize);
|
||||
start += pow(2, (32 - maxsize));
|
||||
}
|
||||
return pairs;
|
||||
}
|
||||
|
||||
|
||||
private static final int[] CIDR2MASK = new int[]{0x00000000, 0x80000000,
|
||||
0xC0000000, 0xE0000000, 0xF0000000, 0xF8000000, 0xFC000000,
|
||||
0xFE000000, 0xFF000000, 0xFF800000, 0xFFC00000, 0xFFE00000,
|
||||
0xFFF00000, 0xFFF80000, 0xFFFC0000, 0xFFFE0000, 0xFFFF0000,
|
||||
0xFFFF8000, 0xFFFFC000, 0xFFFFE000, 0xFFFFF000, 0xFFFFF800,
|
||||
0xFFFFFC00, 0xFFFFFE00, 0xFFFFFF00, 0xFFFFFF80, 0xFFFFFFC0,
|
||||
0xFFFFFFE0, 0xFFFFFFF0, 0xFFFFFFF8, 0xFFFFFFFC, 0xFFFFFFFE,
|
||||
0xFFFFFFFF};
|
||||
public static List<String> rangeToCidrList(String startIp, String endIp) {
|
||||
long start = ipToLong(startIp);
|
||||
long end = ipToLong(endIp);
|
||||
|
||||
private static long ipToLong(String strIP) {
|
||||
long[] ip = new long[4];
|
||||
String[] ipSec = strIP.split("\\.");
|
||||
for (int k = 0; k < 4; k++) {
|
||||
ip[k] = valueOf(ipSec[k]);
|
||||
ArrayList<String> pairs = new ArrayList<>();
|
||||
while (end >= start) {
|
||||
byte maxsize = 32;
|
||||
while (maxsize > 0) {
|
||||
long mask = CIDR2MASK[maxsize - 1];
|
||||
long maskedBase = start & mask;
|
||||
|
||||
if (maskedBase != start) {
|
||||
break;
|
||||
}
|
||||
|
||||
return (ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3];
|
||||
maxsize--;
|
||||
}
|
||||
double x = log(end - start + 1D) / log(2);
|
||||
byte maxdiff = (byte) (32 - floor(x));
|
||||
if (maxsize < maxdiff) {
|
||||
maxsize = maxdiff;
|
||||
}
|
||||
String ip = longToIP(start);
|
||||
pairs.add(ip + "/" + maxsize);
|
||||
start += pow(2, (32 - maxsize));
|
||||
}
|
||||
return pairs;
|
||||
}
|
||||
|
||||
private static long ipToLong(String strIP) {
|
||||
long[] ip = new long[4];
|
||||
String[] ipSec = strIP.split("\\.");
|
||||
for (int k = 0; k < 4; k++) {
|
||||
ip[k] = valueOf(ipSec[k]);
|
||||
}
|
||||
|
||||
private static String longToIP(long longIP) {
|
||||
StringBuilder sb = new StringBuilder("");
|
||||
sb.append(String.valueOf(longIP >>> 24));
|
||||
sb.append(".");
|
||||
sb.append(String.valueOf((longIP & 0x00FFFFFF) >>> 16));
|
||||
sb.append(".");
|
||||
sb.append(String.valueOf((longIP & 0x0000FFFF) >>> 8));
|
||||
sb.append(".");
|
||||
sb.append(String.valueOf(longIP & 0x000000FF));
|
||||
return (ip[0] << 24) + (ip[1] << 16) + (ip[2] << 8) + ip[3];
|
||||
}
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
private static String longToIP(long longIP) {
|
||||
StringBuilder sb = new StringBuilder("");
|
||||
sb.append(String.valueOf(longIP >>> 24));
|
||||
sb.append(".");
|
||||
sb.append(String.valueOf((longIP & 0x00FFFFFF) >>> 16));
|
||||
sb.append(".");
|
||||
sb.append(String.valueOf((longIP & 0x0000FFFF) >>> 8));
|
||||
sb.append(".");
|
||||
sb.append(String.valueOf(longIP & 0x000000FF));
|
||||
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@ -17,6 +17,7 @@ package de.muehlencord.shared.network.whois;
|
||||
|
||||
import static de.muehlencord.shared.network.CidrTool.rangeToCidrList;
|
||||
import static de.muehlencord.shared.util.StringUtil.getValueBetweenKeywords;
|
||||
|
||||
import java.text.ParseException;
|
||||
import java.util.Map;
|
||||
import org.slf4j.Logger;
|
||||
@ -31,7 +32,12 @@ public class ArinWhoisParser extends AbstractWhoisParser implements WhoisParser
|
||||
/**
|
||||
* logger object
|
||||
*/
|
||||
private final static Logger LOGGER = LoggerFactory.getLogger(DefaultWhoisParser.class);
|
||||
private static final Logger logger = LoggerFactory.getLogger(ArinWhoisParser.class);
|
||||
|
||||
private static final String START_STRING = "# start";
|
||||
private static final String END_STRING = "# end";
|
||||
private static final String NET_RANGE = "NetRange:";
|
||||
private static final String ORG_NAME = "OrgName:";
|
||||
/**
|
||||
* information to be returned
|
||||
*/
|
||||
@ -41,19 +47,19 @@ public class ArinWhoisParser extends AbstractWhoisParser implements WhoisParser
|
||||
public WhoisInformation parseWhoIsString(String whoisString) throws WhoisException {
|
||||
whoisInformation = new WhoisInformation();
|
||||
whoisInformation.setResponseString(whoisString);
|
||||
if (whoisString.contains("# start")) { // multiple values
|
||||
if (whoisString.contains(START_STRING)) {
|
||||
|
||||
String multipleWhoisString = whoisString;
|
||||
|
||||
while (multipleWhoisString.contains("# start")) {
|
||||
while (multipleWhoisString.contains(START_STRING)) {
|
||||
String whoisPartString;
|
||||
try {
|
||||
whoisPartString = getValueBetweenKeywords(multipleWhoisString, "# start", "# end");
|
||||
whoisPartString = getValueBetweenKeywords(multipleWhoisString, START_STRING, END_STRING);
|
||||
} catch (ParseException ex) {
|
||||
throw new WhoisException("Error while reading whois part elements. Reason: " + ex.getMessage(), ex);
|
||||
}
|
||||
analyse(whoisPartString);
|
||||
multipleWhoisString = multipleWhoisString.substring(multipleWhoisString.indexOf("# end") + 4);
|
||||
multipleWhoisString = multipleWhoisString.substring(multipleWhoisString.indexOf(END_STRING) + 4);
|
||||
}
|
||||
|
||||
} else {
|
||||
@ -78,11 +84,11 @@ public class ArinWhoisParser extends AbstractWhoisParser implements WhoisParser
|
||||
}
|
||||
|
||||
private void analyseBlock(String block) throws WhoisException {
|
||||
LOGGER.debug("Start analysing block");
|
||||
LOGGER.debug("\n---\n" + block + "\n---\n");
|
||||
logger.debug("Start analysing block");
|
||||
logger.debug("\n---\n{}\n---\n", block);
|
||||
|
||||
if ((block == null) || (block.equals("")) || (!block.contains(" "))) {
|
||||
LOGGER.debug("Skippig empty block");
|
||||
if ((block == null) || (!block.contains(" "))) {
|
||||
logger.debug("Skipping empty block");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -98,23 +104,24 @@ public class ArinWhoisParser extends AbstractWhoisParser implements WhoisParser
|
||||
|
||||
switch (startString) {
|
||||
|
||||
case "NetRange:":
|
||||
if (valueMap.containsKey("NetRange:")) {
|
||||
String netRange = valueMap.get("NetRange:");
|
||||
// convert inetnum to CDIR
|
||||
String[] ipAddresses = netRange.split(" "); // TODO - what happens if not 3 parts are found
|
||||
case NET_RANGE:
|
||||
if (valueMap.containsKey(NET_RANGE)) {
|
||||
String netRange = valueMap.get(NET_RANGE);
|
||||
// convert inetnum to CDIR
|
||||
// TODO - what happens if not 3 parts are found
|
||||
String[] ipAddresses = netRange.split(" ");
|
||||
// FIXME add CDIR notation support
|
||||
String startIpAddress = ipAddresses[0];
|
||||
String endIPAddress = ipAddresses[2];
|
||||
whoisInformation.addNetwork(rangeToCidrList(startIpAddress, endIPAddress));
|
||||
LOGGER.info("Network:" + whoisInformation.getNetwork().toString());
|
||||
logger.info("Network: {}", whoisInformation.getNetwork());
|
||||
} else {
|
||||
throw new WhoisException("Cannot identify netrange value");
|
||||
}
|
||||
break;
|
||||
|
||||
case "OrgName:":
|
||||
String orgName = getValue("OrgName:", valueMap);
|
||||
case ORG_NAME:
|
||||
String orgName = getValue(ORG_NAME, valueMap);
|
||||
String orgId = getValue("OrgId:", valueMap);
|
||||
String country = getValue("Country:", valueMap);
|
||||
|
||||
@ -125,23 +132,23 @@ public class ArinWhoisParser extends AbstractWhoisParser implements WhoisParser
|
||||
orgId = orgName;
|
||||
}
|
||||
whoisInformation.setNetworkInformation(new NetworkInformation(orgName, orgId, country));
|
||||
LOGGER.info("Networkinformation:" + whoisInformation.getNetworkInformation().toString());
|
||||
logger.info("Networkinformation: {}", whoisInformation.getNetworkInformation());
|
||||
break;
|
||||
|
||||
case "OrgAbuseHandle:":
|
||||
// TODO add abuse handler
|
||||
LOGGER.info("Skipping OrgAbuseHandle block");
|
||||
logger.info("Skipping OrgAbuseHandle block");
|
||||
break;
|
||||
case "OrgTechHandle:":
|
||||
// admin person of network server belongs to
|
||||
LOGGER.info("Skipping OrgTechHandle block");
|
||||
logger.info("Skipping OrgTechHandle block");
|
||||
break;
|
||||
|
||||
case "#":
|
||||
LOGGER.info("Skipping comment block");
|
||||
logger.info("Skipping comment block");
|
||||
break;
|
||||
default:
|
||||
LOGGER.info("Unknown block found");
|
||||
logger.info("Unknown block found");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -16,6 +16,7 @@
|
||||
package de.muehlencord.shared.network.whois;
|
||||
|
||||
import static de.muehlencord.shared.network.CidrTool.rangeToCidrList;
|
||||
|
||||
import java.util.Map;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
@ -29,7 +30,7 @@ public class DefaultWhoisParser extends AbstractWhoisParser implements WhoisPars
|
||||
/**
|
||||
* logger object
|
||||
*/
|
||||
private final static Logger LOGGER = LoggerFactory.getLogger(DefaultWhoisParser.class);
|
||||
private static final Logger logger = LoggerFactory.getLogger(DefaultWhoisParser.class);
|
||||
/**
|
||||
* information to be returned
|
||||
*/
|
||||
@ -56,11 +57,11 @@ public class DefaultWhoisParser extends AbstractWhoisParser implements WhoisPars
|
||||
}
|
||||
|
||||
private void analyseBlock(String block) throws WhoisException {
|
||||
LOGGER.debug("Start analysing block");
|
||||
LOGGER.debug("\n---\n" + block + "\n---\n");
|
||||
logger.debug("Start analysing block");
|
||||
logger.debug("\n---\n{}\n---\n", block);
|
||||
|
||||
if ((block == null) || (block.equals("")) || (!block.contains(" "))) {
|
||||
LOGGER.debug("Skippig empty block");
|
||||
if ((block == null) || (!block.contains(" "))) {
|
||||
logger.debug("Skipping empty block");
|
||||
return;
|
||||
}
|
||||
|
||||
@ -76,17 +77,17 @@ public class DefaultWhoisParser extends AbstractWhoisParser implements WhoisPars
|
||||
case "inetnum:":
|
||||
String inetnum = getValue("inetnum:", valueMap);
|
||||
String country = getValue("country:", valueMap);
|
||||
String netname = getValue("descr:", valueMap);
|
||||
String descr = getValue("netname:", valueMap);
|
||||
String parent = getValue("parent:", valueMap);
|
||||
String netname = getValue("netname:", valueMap);
|
||||
String descr = getValue("descr:", valueMap);
|
||||
|
||||
if ((inetnum == null) || (country == null)) {
|
||||
throw new WhoisException("Cannot identify inetnum and/or country value");
|
||||
}
|
||||
|
||||
if (inetnum.contains(" ")) {
|
||||
// convert inetnum to CDIR
|
||||
String[] ipAddresses = inetnum.split(" "); // TODO - what happens if not 3 parts are found
|
||||
// convert inetnum to CDIR
|
||||
// TODO - what happens if not 3 parts are found
|
||||
String[] ipAddresses = inetnum.split(" ");
|
||||
// FIXME add CDIR notation support
|
||||
String startIpAddress = ipAddresses[0];
|
||||
String endIPAddress = ipAddresses[2];
|
||||
@ -95,15 +96,7 @@ public class DefaultWhoisParser extends AbstractWhoisParser implements WhoisPars
|
||||
whoisInformation.addNetwork(inetnum);
|
||||
}
|
||||
|
||||
/*
|
||||
if (parent != null) {
|
||||
whoisInformation.addRootNetwork(parent);
|
||||
LOGGER.info("Root network by parent" + whoisInformation.getRootNetwork().toString());
|
||||
break;
|
||||
}
|
||||
*/
|
||||
|
||||
LOGGER.info("Network:" + whoisInformation.getNetwork().toString());
|
||||
logger.info("Network: {}", whoisInformation.getNetwork());
|
||||
whoisInformation.setNetworkInformation(new NetworkInformation(netname, descr, country));
|
||||
|
||||
break;
|
||||
@ -111,26 +104,26 @@ public class DefaultWhoisParser extends AbstractWhoisParser implements WhoisPars
|
||||
// get information on level-2 network
|
||||
String route = getValue("route:", valueMap);
|
||||
whoisInformation.addRootNetwork(route);
|
||||
LOGGER.info("Root network " + whoisInformation.getRootNetwork().toString());
|
||||
logger.info("Root network: {}", whoisInformation.getRootNetwork());
|
||||
break;
|
||||
|
||||
case "role:":
|
||||
// admin company of network server belongs to
|
||||
LOGGER.info("Skipping role block");
|
||||
logger.info("Skipping role block");
|
||||
break;
|
||||
case "person:":
|
||||
// admin person of network server belongs to
|
||||
LOGGER.info("Skipping person block");
|
||||
logger.info("Skipping person block");
|
||||
break;
|
||||
case "% Information":
|
||||
case "% Note:":
|
||||
case "% This":
|
||||
case "%":
|
||||
LOGGER.info("Skipping comment block");
|
||||
logger.info("Skipping comment block");
|
||||
break;
|
||||
default:
|
||||
LOGGER.info("Unknown block found");
|
||||
LOGGER.error(block);
|
||||
logger.info("Unknown block found");
|
||||
logger.error(block);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,28 @@
|
||||
package de.muehlencord.shared.network.whois;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertNotNull;
|
||||
|
||||
import de.muehlencord.shared.network.BaseTest;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
/**
|
||||
* test the default implementation
|
||||
*
|
||||
* @author Joern Muehlencord, 2021-09-22
|
||||
* @since 1.2.0
|
||||
*/
|
||||
class DefaultWhoisParserTest extends BaseTest {
|
||||
|
||||
@Test
|
||||
void parseWhoIsString() throws Exception {
|
||||
String whoisInformation = this.readContentFromFile("90.63.251.1.txt");
|
||||
DefaultWhoisParser parser = new DefaultWhoisParser();
|
||||
WhoisInformation information = parser.parseWhoIsString(whoisInformation);
|
||||
assertNotNull (information);
|
||||
information.validate();
|
||||
System.out.println ("parseWhoIsString");
|
||||
System.out.println (information.getNetworkInformation().toString());
|
||||
System.out.println (information.getNetwork().toString());
|
||||
System.out.println (information.getRootNetwork().toString());
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,53 @@
|
||||
% This is the RIPE Database query service.
|
||||
% The objects are in RPSL format.
|
||||
%
|
||||
% The RIPE Database is subject to Terms and Conditions.
|
||||
% See http://www.ripe.net/db/support/db-terms-conditions.pdf
|
||||
|
||||
% Note: this output has been filtered.
|
||||
% To receive output for a database update, use the "-B" flag.
|
||||
|
||||
% Information related to '90.63.251.0 - 90.63.251.255'
|
||||
|
||||
% Abuse contact for '90.63.251.0 - 90.63.251.255' is 'gestionip.ft@orange.com'
|
||||
|
||||
inetnum: 90.63.251.0 - 90.63.251.255
|
||||
netname: IP2000-ADSL-BAS
|
||||
descr: LNAUB658 Aubervilliers Bloc 1
|
||||
country: FR
|
||||
admin-c: WITR1-RIPE
|
||||
tech-c: WITR1-RIPE
|
||||
status: ASSIGNED PA
|
||||
remarks: for hacking, spamming or security problems send mail to
|
||||
remarks: abuse@orange.fr
|
||||
mnt-by: FT-BRX
|
||||
created: 2015-10-09T11:39:49Z
|
||||
last-modified: 2019-10-07T13:05:05Z
|
||||
source: RIPE
|
||||
|
||||
role: Wanadoo France Technical Role
|
||||
address: FRANCE TELECOM/SCR
|
||||
address: 48 rue Camille Desmoulins
|
||||
address: 92791 ISSY LES MOULINEAUX CEDEX 9
|
||||
address: FR
|
||||
phone: +33 1 58 88 50 00
|
||||
abuse-mailbox: abuse@orange.fr
|
||||
admin-c: BRX1-RIPE
|
||||
tech-c: BRX1-RIPE
|
||||
nic-hdl: WITR1-RIPE
|
||||
mnt-by: FT-BRX
|
||||
created: 2001-12-04T17:57:08Z
|
||||
last-modified: 2013-07-16T14:09:50Z
|
||||
source: RIPE # Filtered
|
||||
|
||||
% Information related to '90.63.192.0/18AS3215'
|
||||
|
||||
route: 90.63.192.0/18
|
||||
descr: France Telecom IP2000-ADSL-BAS
|
||||
origin: AS3215
|
||||
mnt-by: FT-BRX
|
||||
created: 2012-12-11T10:12:42Z
|
||||
last-modified: 2012-12-11T10:12:42Z
|
||||
source: RIPE
|
||||
|
||||
% This query was served by the RIPE Database Query Service version 1.101 (ANGUS)
|
||||
@ -1,48 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!--
|
||||
Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<!DOCTYPE log4j:configuration PUBLIC "-//APACHE//DTD LOG4J 1.2//EN" "http://logging.apache.org/log4j/1.2/apidocs/org/apache/log4j/xml/doc-files/log4j.dtd">
|
||||
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/"
|
||||
debug="true">
|
||||
|
||||
<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
|
||||
<layout class="org.apache.log4j.PatternLayout">
|
||||
<param name="ConversionPattern" value="%d{ISO8601} %-5p [%c] %m%n" />
|
||||
</layout>
|
||||
</appender>
|
||||
|
||||
<category name="de.muehlencord">
|
||||
<priority value="DEBUG"/>
|
||||
</category>
|
||||
|
||||
<category name="com.sun">
|
||||
<priority value="WARN"/>
|
||||
</category>
|
||||
|
||||
<category name="javax.xml">
|
||||
<priority value="WARN"/>
|
||||
</category>
|
||||
|
||||
<logger name="org.hibernate">
|
||||
<level value="INFO"/>
|
||||
</logger>
|
||||
|
||||
<root>
|
||||
<level value="DEBUG" />
|
||||
<appender-ref ref="consoleAppender" />
|
||||
</root>
|
||||
</log4j:configuration>
|
||||
Reference in New Issue
Block a user