dependency updates

This commit is contained in:
Joern Muehlencord
2021-12-13 22:13:20 +01:00
parent cd2e3b0642
commit 84b8b0545f
23 changed files with 1981 additions and 850 deletions

View File

@ -1,4 +1,3 @@
<!--
Copyright 2019 Joern Muehlencord (joern@muehlencord.de).
@ -14,72 +13,73 @@ 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.
-->
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<project xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://maven.apache.org/POM/4.0.0"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<artifactId>shared-network</artifactId>
<groupId>de.muehlencord.shared</groupId>
<artifactId>shared-network</artifactId>
<build>
<finalName>${project.artifactId}</finalName>
</build>
<dependencies>
<dependency>
<artifactId>junit-jupiter-engine</artifactId>
<groupId>org.junit.jupiter</groupId>
<scope>test</scope>
</dependency>
<dependency>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
<scope>provided</scope>
</dependency>
<dependency>
<artifactId>slf4j-jdk14</artifactId>
<groupId>org.slf4j</groupId>
<scope>test</scope>
</dependency>
<dependency>
<artifactId>shared-util</artifactId>
<groupId>de.muehlencord.shared</groupId>
<type>jar</type>
</dependency>
<dependency>
<artifactId>javax.mail</artifactId>
<groupId>com.sun.mail</groupId>
</dependency>
<dependency>
<artifactId>ews-java-api</artifactId>
<groupId>com.microsoft.ews-java-api</groupId>
</dependency>
<dependency>
<artifactId>commons-net</artifactId>
<groupId>commons-net</groupId>
<scope>compile</scope>
</dependency>
<dependency>
<artifactId>jaxws-api</artifactId>
<groupId>javax.xml.ws</groupId>
<scope>test</scope>
<version>2.3.1</version>
</dependency>
</dependencies>
<groupId>de.muehlencord.shared</groupId>
<modelVersion>4.0.0</modelVersion>
<name>shared-network</name>
<packaging>jar</packaging>
<parent>
<artifactId>shared</artifactId>
<groupId>de.muehlencord</groupId>
<version>1.2-SNAPSHOT</version>
<packaging>jar</packaging>
<name>shared-network</name>
<parent>
<artifactId>shared</artifactId>
<groupId>de.muehlencord</groupId>
<version>1.2-SNAPSHOT</version>
</parent>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<build>
<finalName>${project.artifactId}</finalName>
</build>
</parent>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-engine</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>de.muehlencord.shared</groupId>
<artifactId>shared-util</artifactId>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>javax.mail</artifactId>
</dependency>
<dependency>
<groupId>com.microsoft.ews-java-api</groupId>
<artifactId>ews-java-api</artifactId>
</dependency>
<dependency>
<groupId>commons-net</groupId>
<artifactId>commons-net</artifactId>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>javax.xml.ws</groupId>
<artifactId>jaxws-api</artifactId>
<version>2.3.1</version>
<scope>test</scope>
</dependency>
</dependencies>
<url>http://maven.apache.org</url>
<version>1.2-SNAPSHOT</version>
</project>

View File

@ -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();
}
}

View File

@ -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");
}
}
}

View File

@ -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);
}
}
}

View File

@ -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());
}
}

View File

@ -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)

View File

@ -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>