diff --git a/build.gradle b/build.gradle index a3312d73..eda7456e 100644 --- a/build.gradle +++ b/build.gradle @@ -4,7 +4,7 @@ import org.gradle.plugins.ide.eclipse.model.AccessRule buildscript { dependencies { - classpath 'com.bmuschko:gradle-izpack-plugin:3.0' + classpath 'com.bmuschko:gradle-izpack-plugin:3.2' } } @@ -14,9 +14,9 @@ plugins { id 'eclipse' id 'me.champeau.jmh' version '0.7.3' id 'com.bmuschko.izpack' version '3.2' - id 'com.github.jk1.dependency-license-report' version '2.5' + id 'com.github.jk1.dependency-license-report' version '3.0.1' id "de.undercouch.download" version "5.6.0" - id "com.diffplug.spotless" version "7.1.0" + id "com.diffplug.spotless" version "8.1.0" } repositories { @@ -30,50 +30,52 @@ dependencies { annotationProcessor 'org.projectlombok:lombok:1.18.42' testCompileOnly 'org.projectlombok:lombok:1.18.42' testAnnotationProcessor 'org.projectlombok:lombok:1.18.42' + compileOnly 'org.jspecify:jspecify:0.3.0' + testCompileOnly 'org.jspecify:jspecify:0.3.0' - testImplementation 'org.junit.jupiter:junit-jupiter:6.0.0' - testRuntimeOnly 'org.junit.platform:junit-platform-launcher' - testImplementation 'org.assertj:assertj-core:3.23.1' - testImplementation 'org.mockito:mockito-core:4.7.0' + testImplementation 'org.junit.jupiter:junit-jupiter:6.1.0-M1' + testRuntimeOnly 'org.junit.platform:junit-platform-launcher:6.1.0-M1' + testImplementation 'org.assertj:assertj-core:4.0.0-M1' + testImplementation 'org.mockito:mockito-core:5.21.0' testImplementation 'org.projectlombok:lombok:1.18.42' - implementation 'com.google.guava:guava:24.1-jre' - implementation 'commons-codec:commons-codec:1.6' - implementation 'commons-io:commons-io:2.4' - implementation 'org.apache.commons:commons-lang3:3.1' - implementation 'org.apache.commons:commons-collections4:4.0' - implementation 'org.xerial:sqlite-jdbc:3.7.2' - implementation 'com.j256.ormlite:ormlite-core:4.48' - implementation 'com.j256.ormlite:ormlite-jdbc:4.48' - implementation 'com.google.protobuf:protobuf-java:4.31.1' - implementation 'org.slf4j:slf4j-api:1.7.14' - implementation 'org.slf4j:slf4j-log4j12:1.7.25' - implementation 'com.googlecode.java-diff-utils:diffutils:1.2.1' - implementation 'com.google.re2j:re2j:1.1' - implementation 'com.github.mobius-software-ltd:mqtt-parser:parser-1.0.3' - implementation 'net.arnx:jsonic:1.3.0' - implementation 'org.json:json:20180813' - implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.10.0' - implementation 'com.fasterxml.jackson.core:jackson-databind:2.10.0' - implementation 'org.msgpack:jackson-dataformat-msgpack:0.8.18' - implementation 'org.bouncycastle:bcpkix-jdk15on:1.64' - implementation 'commons-net:commons-net:3.6' + implementation 'com.google.guava:guava:33.5.0-jre' + implementation 'commons-codec:commons-codec:1.20.0' + implementation 'commons-io:commons-io:2.21.0' + implementation 'org.apache.commons:commons-lang3:3.20.0' + implementation 'org.apache.commons:commons-collections4:4.5.0' + implementation 'org.xerial:sqlite-jdbc:3.51.1.0' + implementation 'com.j256.ormlite:ormlite-core:6.1' + implementation 'com.j256.ormlite:ormlite-jdbc:6.1' + implementation 'com.google.protobuf:protobuf-java:4.33.2' + implementation 'org.slf4j:slf4j-api:2.1.0-alpha1' + implementation 'org.slf4j:slf4j-log4j12:2.1.0-alpha1' + implementation 'io.github.java-diff-utils:java-diff-utils:4.16' + implementation 'com.google.re2j:re2j:1.8' + implementation 'com.github.mobius-software-ltd:mqtt-parser:parser-1.0.6' + implementation 'net.arnx:jsonic:1.3.10' + implementation 'org.json:json:20250517' + implementation 'com.fasterxml.jackson.dataformat:jackson-dataformat-cbor:2.20.1' + implementation 'com.fasterxml.jackson.core:jackson-databind:2.20.1' + implementation 'org.msgpack:jackson-dataformat-msgpack:0.9.10' + implementation 'org.bouncycastle:bcpkix-jdk18on:1.83' + implementation 'commons-net:commons-net:3.12.0' implementation 'org.nanohttpd:nanohttpd:2.3.1' - implementation 'com.google.code.gson:gson:2.13.1' - implementation 'org.apache.commons:commons-math3:3.0' - implementation 'org.jfree:jfreechart:1.5.3' - implementation 'org.ejml:ejml-all:0.41' - implementation 'at.favre.lib:hkdf:1.1.0' - implementation 'org.eclipse.jetty.http2:http2-hpack:11.0.11' - implementation 'org.eclipse.jetty.http3:http3-qpack:11.0.11' - implementation 'com.github.docker-java:docker-java:3.3.0' - implementation 'com.github.docker-java:docker-java-transport-httpclient5:3.3.0' + implementation 'com.google.code.gson:gson:2.13.2' + implementation 'org.apache.commons:commons-math3:3.6.1' + implementation 'org.jfree:jfreechart:1.5.6' + implementation 'org.ejml:ejml-all:0.44.0' + implementation 'at.favre.lib:hkdf:2.0.0' + implementation 'org.eclipse.jetty.http2:http2-hpack:11.0.26' + implementation 'org.eclipse.jetty.http3:http3-qpack:11.0.26' + implementation 'com.github.docker-java:docker-java:3.7.0' + implementation 'com.github.docker-java:docker-java-transport-httpclient5:3.7.0' implementation 'org.apache.commons:commons-compress:1.28.0' - implementation 'com.github.luben:zstd-jni:1.5.6-3' + implementation 'com.github.luben:zstd-jni:1.5.7-6' implementation 'org.brotli:dec:0.1.2' implementation files('libs/agent15.jar') - izpack 'org.codehaus.izpack:izpack-dist:5.1.3' + izpack 'org.codehaus.izpack:izpack-dist:5.2.4' // load additional dena modules if it exists ['dena/', 'denaN/', 'denaL/'].each { def dir -> diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar index 1b33c55b..f8e1ee31 100644 Binary files a/gradle/wrapper/gradle-wrapper.jar and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 2e111328..23449a2b 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-9.1.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-9.2.1-bin.zip networkTimeout=10000 validateDistributionUrl=true zipStoreBase=GRADLE_USER_HOME diff --git a/gradlew b/gradlew index 23d15a93..adff685a 100755 --- a/gradlew +++ b/gradlew @@ -1,7 +1,7 @@ #!/bin/sh # -# Copyright © 2015-2021 the original authors. +# Copyright © 2015 the original authors. # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. @@ -114,7 +114,6 @@ case "$( uname )" in #( NONSTOP* ) nonstop=true ;; esac -CLASSPATH="\\\"\\\"" # Determine the Java command to use to start the JVM. @@ -172,7 +171,6 @@ fi # For Cygwin or MSYS, switch paths to Windows format before running java if "$cygwin" || "$msys" ; then APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) - CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) JAVACMD=$( cygpath --unix "$JAVACMD" ) @@ -212,7 +210,6 @@ DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' set -- \ "-Dorg.gradle.appname=$APP_BASE_NAME" \ - -classpath "$CLASSPATH" \ -jar "$APP_HOME/gradle/wrapper/gradle-wrapper.jar" \ "$@" diff --git a/gradlew.bat b/gradlew.bat index 5eed7ee8..e509b2dd 100644 --- a/gradlew.bat +++ b/gradlew.bat @@ -70,11 +70,10 @@ goto fail :execute @rem Setup the command line -set CLASSPATH= @rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell diff --git a/src/main/java/core/packetproxy/ProxyFactory.java b/src/main/java/core/packetproxy/ProxyFactory.java index b34a7f35..33cf32ba 100644 --- a/src/main/java/core/packetproxy/ProxyFactory.java +++ b/src/main/java/core/packetproxy/ProxyFactory.java @@ -67,7 +67,8 @@ public static Proxy create(ListenPort listen_info) throws Exception { listen_socket.setReuseAddress(true); proxy = new ProxyXmppSSLForward(listen_socket, listen_info); - } else { /* FORWARDER */ + } else { + /* FORWARDER */ ServerSocket listen_socket = new ServerSocket(listen_info.getPort()); listen_socket.setReuseAddress(true); diff --git a/src/main/java/core/packetproxy/common/MessagePack.java b/src/main/java/core/packetproxy/common/MessagePack.java index 9a3e8a4c..a1a163ec 100644 --- a/src/main/java/core/packetproxy/common/MessagePack.java +++ b/src/main/java/core/packetproxy/common/MessagePack.java @@ -37,7 +37,7 @@ public class MessagePack { // 元々のMessagePackの型情報を保持する public static class Key { - public static enum Type { + public enum Type { Integer, UnsignedInteger, Float, Boolean, RawString, RawBinary, Map, Array, Extension, Nil, None; public static Type fromString(String str) { diff --git a/src/main/java/core/packetproxy/common/Protobuf3.java b/src/main/java/core/packetproxy/common/Protobuf3.java index 8d80d1b0..8b1da4f8 100644 --- a/src/main/java/core/packetproxy/common/Protobuf3.java +++ b/src/main/java/core/packetproxy/common/Protobuf3.java @@ -37,7 +37,7 @@ public class Protobuf3 { public static class Key { - public static enum Type { + public enum Type { Variant, Bit64, LengthDelimited, StartGroup, EndGroup, Bit32, None, Reserved } diff --git a/src/main/java/core/packetproxy/http2/FrameManager.java b/src/main/java/core/packetproxy/http2/FrameManager.java index e2f3acdb..373657ff 100644 --- a/src/main/java/core/packetproxy/http2/FrameManager.java +++ b/src/main/java/core/packetproxy/http2/FrameManager.java @@ -29,7 +29,7 @@ public class FrameManager { - private HpackEncoder hpackEncoder = new HpackEncoder(4096, 65536); + private HpackEncoder hpackEncoder = new HpackEncoder(); private HpackDecoder hpackDecoder; private List headersDataFrames = new LinkedList<>(); private List controlFrames = new LinkedList<>(); @@ -40,6 +40,8 @@ public class FrameManager { public FrameManager() throws Exception { flowControlManager = new FlowControlManager(); + hpackEncoder.setMaxTableCapacity(65536); + hpackEncoder.setTableCapacity(4096); } public HpackDecoder getHpackDecoder() { @@ -87,7 +89,9 @@ private void analyzeFrame(Frame frame) throws Exception { int header_table_size = settingsFrame.get(SettingsFrameType.SETTINGS_HEADER_TABLE_SIZE); int header_list_size = settingsFrame.get(SettingsFrameType.SETTINGS_MAX_HEADER_LIST_SIZE); - hpackDecoder = new HpackDecoder(header_table_size, header_list_size); + hpackDecoder = new HpackDecoder(header_list_size, System::nanoTime); + hpackDecoder.setMaxTableCapacity(header_table_size); + hpackDecoder.setMaxHeaderListSize(header_list_size); flag_receive_peer_settings = true; if (flag_send_end_settings == false && flag_send_settings == true) { diff --git a/src/main/java/core/packetproxy/http2/frames/SettingsFrame.java b/src/main/java/core/packetproxy/http2/frames/SettingsFrame.java index 97f4432a..ae612c40 100644 --- a/src/main/java/core/packetproxy/http2/frames/SettingsFrame.java +++ b/src/main/java/core/packetproxy/http2/frames/SettingsFrame.java @@ -23,7 +23,7 @@ public class SettingsFrame extends Frame { protected static Type TYPE = Type.SETTINGS; - public static enum SettingsFrameType { + public enum SettingsFrameType { RESERVED, SETTINGS_HEADER_TABLE_SIZE, SETTINGS_ENABLE_PUSH, SETTINGS_MAX_CONCURRENT_STREAMS, SETTINGS_INITIAL_WINDOW_SIZE, SETTINGS_MAX_FRAME_SIZE, SETTINGS_MAX_HEADER_LIST_SIZE, }; diff --git a/src/main/java/core/packetproxy/http3/service/Http3HeaderDecoder.java b/src/main/java/core/packetproxy/http3/service/Http3HeaderDecoder.java index 5519bef6..7576f742 100644 --- a/src/main/java/core/packetproxy/http3/service/Http3HeaderDecoder.java +++ b/src/main/java/core/packetproxy/http3/service/Http3HeaderDecoder.java @@ -36,7 +36,10 @@ public class Http3HeaderDecoder { final QpackDecoder decoder; public Http3HeaderDecoder() { - this.decoder = new QpackDecoder(instructions -> instructions.forEach(i -> i.encode(this.lease)), 1024 * 1024); + this.decoder = new QpackDecoder(instructions -> instructions.forEach(i -> i.encode(this.lease))); + this.decoder.setMaxHeadersSize(1024 * 1024); + this.decoder.setMaxTableCapacity(1024 * 1024); + this.decoder.setBeginNanoTimeSupplier(System::nanoTime); } /** デコーダに命令を入力する Note: デコーダの内部状態が変化します */ @@ -55,7 +58,7 @@ public byte[] getInstructions() { /** エンコードされたヘッダをデコードする Note: デコーダの内部状態が変化します */ public List decode(long streamId, byte[] headerEncoded) throws QpackException { List metaDataList = new ArrayList<>(); - this.decoder.decode(streamId, ByteBuffer.wrap(headerEncoded), (sid, metadata) -> { + this.decoder.decode(streamId, ByteBuffer.wrap(headerEncoded), (sid, metadata, wasBlocked) -> { metaDataList.add(metadata); }); return metaDataList; diff --git a/src/main/java/core/packetproxy/http3/service/Http3HeaderEncoder.java b/src/main/java/core/packetproxy/http3/service/Http3HeaderEncoder.java index ae4a703e..00986a4b 100644 --- a/src/main/java/core/packetproxy/http3/service/Http3HeaderEncoder.java +++ b/src/main/java/core/packetproxy/http3/service/Http3HeaderEncoder.java @@ -34,8 +34,9 @@ public class Http3HeaderEncoder { final QpackEncoder encoder; public Http3HeaderEncoder(long capacity) { - this.encoder = new QpackEncoder(instructions -> instructions.forEach(i -> i.encode(this.lease)), 1024 * 1024); - this.encoder.setCapacity((int) capacity); + this.encoder = new QpackEncoder(instructions -> instructions.forEach(i -> i.encode(this.lease))); + this.encoder.setMaxTableCapacity((int) capacity); + this.encoder.setTableCapacity((int) capacity); } /** エンコーダに命令を入力する Note: エンコーダの内部状態が変化します */ diff --git a/src/main/java/core/packetproxy/model/Database.java b/src/main/java/core/packetproxy/model/Database.java index d8d73988..d3507703 100644 --- a/src/main/java/core/packetproxy/model/Database.java +++ b/src/main/java/core/packetproxy/model/Database.java @@ -23,7 +23,8 @@ import com.j256.ormlite.dao.Dao; import com.j256.ormlite.dao.DaoManager; import com.j256.ormlite.jdbc.JdbcConnectionSource; -import com.j256.ormlite.logger.LocalLog; +import com.j256.ormlite.logger.Level; +import com.j256.ormlite.logger.Logger; import com.j256.ormlite.support.ConnectionSource; import com.j256.ormlite.support.DatabaseConnection; import com.j256.ormlite.table.TableUtils; @@ -74,9 +75,9 @@ private void createDB() throws Exception { } } - System.setProperty(LocalLog.LOCAL_LOG_LEVEL_PROPERTY, "error"); + Logger.setGlobalLogLevel(Level.ERROR); source = new JdbcConnectionSource(getDatabaseURL()); - DatabaseConnection conn = source.getReadWriteConnection(); + DatabaseConnection conn = source.getReadWriteConnection(null); conn.executeStatement("pragma auto_vacuum = full", DatabaseConnection.DEFAULT_RESULT_FLAGS); } @@ -121,7 +122,7 @@ public void dropPacketTableFaster() throws Exception { Path src = Paths.get(instance.databasePath.getParent().toAbsolutePath().toString() + "/tmp.sqlite3"); Path dst = instance.databasePath.toAbsolutePath(); firePropertyChange(DatabaseMessage.DISCONNECT_NOW); - DatabaseConnection conn = source.getReadWriteConnection(); + DatabaseConnection conn = source.getReadWriteConnection(null); conn.close(); Files.move(dst, src, StandardCopyOption.REPLACE_EXISTING); @@ -175,7 +176,7 @@ private static void migrateTableWithoutHistory(Path srcDBPath, Path dstDBPath) { try { ConnectionSource source = new JdbcConnectionSource("jdbc:sqlite:" + srcDBPath); - DatabaseConnection conn = source.getReadWriteConnection(); + DatabaseConnection conn = source.getReadWriteConnection(null); conn.executeStatement("attach database '" + dstDBPath.toAbsolutePath() + "' as 'dstDB'", DatabaseConnection.DEFAULT_RESULT_FLAGS); conn.executeStatement("attach database '" + srcDBPath.toAbsolutePath() + "' as 'srcDB'", @@ -260,7 +261,7 @@ public void saveWithoutLog(String path) throws Exception { Path dest = FileSystems.getDefault().getPath(path); Files.copy(src, dest, StandardCopyOption.REPLACE_EXISTING); JdbcConnectionSource new_db = new JdbcConnectionSource("jdbc:sqlite:" + dest); - DatabaseConnection conn = new_db.getReadWriteConnection(); + DatabaseConnection conn = new_db.getReadWriteConnection(null); conn.executeStatement("delete from packets", DatabaseConnection.DEFAULT_RESULT_FLAGS); conn.close(); new_db.close(); diff --git a/src/main/java/core/packetproxy/model/Diff.java b/src/main/java/core/packetproxy/model/Diff.java index 8636cb9a..fa86d30a 100644 --- a/src/main/java/core/packetproxy/model/Diff.java +++ b/src/main/java/core/packetproxy/model/Diff.java @@ -17,10 +17,11 @@ import static packetproxy.util.Logging.errWithStackTrace; -import difflib.Chunk; -import difflib.Delta; -import difflib.DiffUtils; -import difflib.Patch; +import com.github.difflib.DiffUtils; +import com.github.difflib.patch.AbstractDelta; +import com.github.difflib.patch.Chunk; +import com.github.difflib.patch.DeltaType; +import com.github.difflib.patch.Patch; import java.util.Arrays; import java.util.List; @@ -70,24 +71,24 @@ public static void diffPerCharacter(DiffSet set, DiffEventListener original_even List listOrig = Arrays.asList(new String(set.getOriginal()).split("")); List listTarg = Arrays.asList(new String(set.getTarget()).split("")); - Patch diff = DiffUtils.diff(listOrig, listTarg); + Patch diff = DiffUtils.diff(listOrig, listTarg); - List deltas = diff.getDeltas(); - for (Delta delta : deltas) { + List> deltas = diff.getDeltas(); + for (AbstractDelta delta : deltas) { - Chunk chunkOrig = delta.getOriginal(); - Chunk chunkTarg = delta.getRevised(); - if (delta.getType() == Delta.TYPE.CHANGE) { + Chunk chunkOrig = delta.getSource(); + Chunk chunkTarg = delta.getTarget(); + if (delta.getType() == DeltaType.CHANGE) { original_event.foundChgDelta(chunkPositionPerCharacter(listOrig, chunkOrig), chunkLengthPerCharacter(chunkOrig)); target_event.foundChgDelta(chunkPositionPerCharacter(listTarg, chunkTarg), chunkLengthPerCharacter(chunkTarg)); - } else if (delta.getType() == Delta.TYPE.INSERT) { + } else if (delta.getType() == DeltaType.INSERT) { target_event.foundInsDelta(chunkPositionPerCharacter(listTarg, chunkTarg), chunkLengthPerCharacter(chunkTarg)); - } else if (delta.getType() == Delta.TYPE.DELETE) { + } else if (delta.getType() == DeltaType.DELETE) { original_event.foundDelDelta(chunkPositionPerCharacter(listOrig, chunkOrig), chunkLengthPerCharacter(chunkOrig)); @@ -106,24 +107,24 @@ public static void diffPerLine(DiffSet set, DiffEventListener original_event, Di List listOrig = Arrays.asList(new String(set.getOriginal()).split("\n")); List listTarg = Arrays.asList(new String(set.getTarget()).split("\n")); - Patch diff = DiffUtils.diff(listOrig, listTarg); + Patch diff = DiffUtils.diff(listOrig, listTarg); - List deltas = diff.getDeltas(); - for (Delta delta : deltas) { + List> deltas = diff.getDeltas(); + for (AbstractDelta delta : deltas) { - Chunk chunkOrig = delta.getOriginal(); - Chunk chunkTarg = delta.getRevised(); - if (delta.getType() == Delta.TYPE.CHANGE) { + Chunk chunkOrig = delta.getSource(); + Chunk chunkTarg = delta.getTarget(); + if (delta.getType() == DeltaType.CHANGE) { original_event.foundChgDelta(chunkPositionPerLine(listOrig, chunkOrig), chunkLengthPerLine(chunkOrig)); target_event.foundChgDelta(chunkPositionPerLine(listTarg, chunkTarg), chunkLengthPerLine(chunkTarg)); - } else if (delta.getType() == Delta.TYPE.INSERT) { + } else if (delta.getType() == DeltaType.INSERT) { target_event.foundInsDelta(chunkPositionPerLine(listTarg, chunkTarg), chunkLengthPerLine(chunkTarg)); - } else if (delta.getType() == Delta.TYPE.DELETE) { + } else if (delta.getType() == DeltaType.DELETE) { original_event.foundDelDelta(chunkPositionPerLine(listOrig, chunkOrig), chunkLengthPerLine(chunkOrig)); diff --git a/src/main/java/core/packetproxy/model/DiffBase.java b/src/main/java/core/packetproxy/model/DiffBase.java index 19b60fb0..87a7c3e7 100644 --- a/src/main/java/core/packetproxy/model/DiffBase.java +++ b/src/main/java/core/packetproxy/model/DiffBase.java @@ -15,7 +15,7 @@ */ package packetproxy.model; -import difflib.Chunk; +import com.github.difflib.patch.Chunk; import java.util.List; import javax.swing.event.EventListenerList; diff --git a/src/main/java/core/packetproxy/model/DiffBinary.java b/src/main/java/core/packetproxy/model/DiffBinary.java index 38e3c7ec..88fc836f 100644 --- a/src/main/java/core/packetproxy/model/DiffBinary.java +++ b/src/main/java/core/packetproxy/model/DiffBinary.java @@ -17,11 +17,12 @@ import static packetproxy.util.Logging.errWithStackTrace; +import com.github.difflib.DiffUtils; +import com.github.difflib.patch.AbstractDelta; +import com.github.difflib.patch.Chunk; +import com.github.difflib.patch.DeltaType; +import com.github.difflib.patch.Patch; import com.google.common.primitives.Bytes; -import difflib.Chunk; -import difflib.Delta; -import difflib.DiffUtils; -import difflib.Patch; import java.util.List; public class DiffBinary extends DiffBase { @@ -70,24 +71,24 @@ public static void diffPerCharacter(DiffSet set, DiffEventListener original_even List listOrig = Bytes.asList(set.getOriginal()); List listTarg = Bytes.asList(set.getTarget()); - Patch diff = DiffUtils.diff(listOrig, listTarg); + Patch diff = DiffUtils.diff(listOrig, listTarg); - List deltas = diff.getDeltas(); - for (Delta delta : deltas) { + List> deltas = diff.getDeltas(); + for (AbstractDelta delta : deltas) { - Chunk chunkOrig = delta.getOriginal(); - Chunk chunkTarg = delta.getRevised(); - if (delta.getType() == Delta.TYPE.CHANGE) { + Chunk chunkOrig = delta.getSource(); + Chunk chunkTarg = delta.getTarget(); + if (delta.getType() == DeltaType.CHANGE) { original_event.foundChgDelta(chunkPositionPerByte(listOrig, chunkOrig), chunkLengthPerByte(chunkOrig)); target_event.foundChgDelta(chunkPositionPerByte(listTarg, chunkTarg), chunkLengthPerByte(chunkTarg)); - } else if (delta.getType() == Delta.TYPE.INSERT) { + } else if (delta.getType() == DeltaType.INSERT) { target_event.foundInsDelta(chunkPositionPerByte(listTarg, chunkTarg), chunkLengthPerByte(chunkTarg)); - } else if (delta.getType() == Delta.TYPE.DELETE) { + } else if (delta.getType() == DeltaType.DELETE) { original_event.foundDelDelta(chunkPositionPerByte(listOrig, chunkOrig), chunkLengthPerByte(chunkOrig)); diff --git a/src/main/java/core/packetproxy/model/DiffJson.java b/src/main/java/core/packetproxy/model/DiffJson.java index c091f191..023bfcfd 100644 --- a/src/main/java/core/packetproxy/model/DiffJson.java +++ b/src/main/java/core/packetproxy/model/DiffJson.java @@ -17,10 +17,11 @@ import static packetproxy.util.Logging.errWithStackTrace; -import difflib.Chunk; -import difflib.Delta; -import difflib.DiffUtils; -import difflib.Patch; +import com.github.difflib.DiffUtils; +import com.github.difflib.patch.AbstractDelta; +import com.github.difflib.patch.Chunk; +import com.github.difflib.patch.DeltaType; +import com.github.difflib.patch.Patch; import java.util.Arrays; import java.util.List; @@ -70,24 +71,24 @@ public static void diffPerCharacter(DiffSet set, DiffEventListener original_even List listOrig = Arrays.asList(new String(set.getOriginal()).split("")); List listTarg = Arrays.asList(new String(set.getTarget()).split("")); - Patch diff = DiffUtils.diff(listOrig, listTarg); + Patch diff = DiffUtils.diff(listOrig, listTarg); - List deltas = diff.getDeltas(); - for (Delta delta : deltas) { + List> deltas = diff.getDeltas(); + for (AbstractDelta delta : deltas) { - Chunk chunkOrig = delta.getOriginal(); - Chunk chunkTarg = delta.getRevised(); - if (delta.getType() == Delta.TYPE.CHANGE) { + Chunk chunkOrig = delta.getSource(); + Chunk chunkTarg = delta.getTarget(); + if (delta.getType() == DeltaType.CHANGE) { original_event.foundChgDelta(chunkPositionPerCharacter(listOrig, chunkOrig), chunkLengthPerCharacter(chunkOrig)); target_event.foundChgDelta(chunkPositionPerCharacter(listTarg, chunkTarg), chunkLengthPerCharacter(chunkTarg)); - } else if (delta.getType() == Delta.TYPE.INSERT) { + } else if (delta.getType() == DeltaType.INSERT) { target_event.foundInsDelta(chunkPositionPerCharacter(listTarg, chunkTarg), chunkLengthPerCharacter(chunkTarg)); - } else if (delta.getType() == Delta.TYPE.DELETE) { + } else if (delta.getType() == DeltaType.DELETE) { original_event.foundDelDelta(chunkPositionPerCharacter(listOrig, chunkOrig), chunkLengthPerCharacter(chunkOrig)); @@ -106,24 +107,24 @@ public static void diffPerLine(DiffSet set, DiffEventListener original_event, Di List listOrig = Arrays.asList(new String(set.getOriginal()).split("\n")); List listTarg = Arrays.asList(new String(set.getTarget()).split("\n")); - Patch diff = DiffUtils.diff(listOrig, listTarg); + Patch diff = DiffUtils.diff(listOrig, listTarg); - List deltas = diff.getDeltas(); - for (Delta delta : deltas) { + List> deltas = diff.getDeltas(); + for (AbstractDelta delta : deltas) { - Chunk chunkOrig = delta.getOriginal(); - Chunk chunkTarg = delta.getRevised(); - if (delta.getType() == Delta.TYPE.CHANGE) { + Chunk chunkOrig = delta.getSource(); + Chunk chunkTarg = delta.getTarget(); + if (delta.getType() == DeltaType.CHANGE) { original_event.foundChgDelta(chunkPositionPerLine(listOrig, chunkOrig), chunkLengthPerLine(chunkOrig)); target_event.foundChgDelta(chunkPositionPerLine(listTarg, chunkTarg), chunkLengthPerLine(chunkTarg)); - } else if (delta.getType() == Delta.TYPE.INSERT) { + } else if (delta.getType() == DeltaType.INSERT) { target_event.foundInsDelta(chunkPositionPerLine(listTarg, chunkTarg), chunkLengthPerLine(chunkTarg)); - } else if (delta.getType() == Delta.TYPE.DELETE) { + } else if (delta.getType() == DeltaType.DELETE) { original_event.foundDelDelta(chunkPositionPerLine(listOrig, chunkOrig), chunkLengthPerLine(chunkOrig)); diff --git a/src/main/java/core/packetproxy/model/InterceptOption.java b/src/main/java/core/packetproxy/model/InterceptOption.java index 3a16ddcf..e636b4ab 100644 --- a/src/main/java/core/packetproxy/model/InterceptOption.java +++ b/src/main/java/core/packetproxy/model/InterceptOption.java @@ -28,19 +28,19 @@ public class InterceptOption { public static final int ALL_SERVER = -1; - public static enum Type { + public enum Type { REQUEST, /* TODO HOST, URL,*/ }; - public static enum Direction { + public enum Direction { REQUEST, RESPONSE, ALL_THE_OTHER_REQUESTS, ALL_THE_OTHER_RESPONSES }; // 両方同じルールで捕まえたい事はないのでALLは無し - public static enum Relationship { + public enum Relationship { IS_INTERCEPTED_IF_IT_MATCHES, IS_INTERCEPTED_IF_REQUEST_WAS_INTERCEPTED, IS_NOT_INTERCEPTED_IF_IT_MATCHES, ARE_INTERCEPTED, ARE_NOT_INTERCEPTED }; - public static enum Method { + public enum Method { SIMPLE, REGEX, BINARY, UNDEFINED }; diff --git a/src/main/java/core/packetproxy/quic/value/key/Key.java b/src/main/java/core/packetproxy/quic/value/key/Key.java index 2b2c42ff..33802288 100644 --- a/src/main/java/core/packetproxy/quic/value/key/Key.java +++ b/src/main/java/core/packetproxy/quic/value/key/Key.java @@ -16,7 +16,7 @@ package packetproxy.quic.value.key; -import at.favre.lib.crypto.HKDF; +import at.favre.lib.hkdf.HKDF; import java.nio.ByteBuffer; import javax.crypto.Cipher; import javax.crypto.spec.GCMParameterSpec; diff --git a/src/main/java/core/packetproxy/quic/value/key/level/InitialKey.java b/src/main/java/core/packetproxy/quic/value/key/level/InitialKey.java index 0393bc64..01c19f57 100644 --- a/src/main/java/core/packetproxy/quic/value/key/level/InitialKey.java +++ b/src/main/java/core/packetproxy/quic/value/key/level/InitialKey.java @@ -16,7 +16,7 @@ package packetproxy.quic.value.key.level; -import at.favre.lib.crypto.HKDF; +import at.favre.lib.hkdf.HKDF; import lombok.EqualsAndHashCode; import lombok.Value; import packetproxy.quic.utils.Constants; diff --git a/src/main/java/core/packetproxy/util/Throwing.java b/src/main/java/core/packetproxy/util/Throwing.java index b680f476..f38193ab 100644 --- a/src/main/java/core/packetproxy/util/Throwing.java +++ b/src/main/java/core/packetproxy/util/Throwing.java @@ -1,33 +1,37 @@ package packetproxy.util; +import java.io.UncheckedIOException; import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Predicate; -import javax.annotation.Nonnull; public class Throwing { private Throwing() { } - @Nonnull - public static Consumer rethrow(@Nonnull final ThrowingConsumer consumer) { + public static Consumer rethrow(final ThrowingConsumer consumer) { return consumer; } - @Nonnull - public static Predicate rethrowP(@Nonnull final ThrowingPredicate predicate) { + public static Predicate rethrowP(final ThrowingPredicate predicate) { return predicate; } - @Nonnull - public static Function rethrowF(@Nonnull final ThrowingFunction function) { + public static Function rethrowF(final ThrowingFunction function) { return function; } - @SuppressWarnings("unchecked") - @Nonnull - public static void sneakyThrow(@Nonnull Throwable ex) throws E { - throw (E) ex; + public static void sneakyThrow(Throwable ex) { + if (ex instanceof RuntimeException runtimeException) { + throw runtimeException; + } + if (ex instanceof Error error) { + throw error; + } + if (ex instanceof java.io.IOException ioException) { + throw new UncheckedIOException(ioException); + } + throw new RuntimeException(ex); } } diff --git a/src/main/java/core/packetproxy/util/WithCounter.java b/src/main/java/core/packetproxy/util/WithCounter.java index eb0801f1..2d14b594 100644 --- a/src/main/java/core/packetproxy/util/WithCounter.java +++ b/src/main/java/core/packetproxy/util/WithCounter.java @@ -2,15 +2,13 @@ import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; -import javax.annotation.Nonnull; public class WithCounter { private WithCounter() { } - @Nonnull - public static Consumer withCounter(@Nonnull final ThrowingBiConsumer consumer) { + public static Consumer withCounter(final ThrowingBiConsumer consumer) { AtomicInteger counter = new AtomicInteger(0); return (T item) -> { consumer.accept(counter.getAndIncrement(), item); diff --git a/src/main/java/core/packetproxy/util/package-info.java b/src/main/java/core/packetproxy/util/package-info.java new file mode 100644 index 00000000..133544a5 --- /dev/null +++ b/src/main/java/core/packetproxy/util/package-info.java @@ -0,0 +1,2 @@ +@org.jspecify.annotations.NullMarked +package packetproxy.util; diff --git a/src/test/java/packetproxy/http2/frames/HeadersFrameTest.java b/src/test/java/packetproxy/http2/frames/HeadersFrameTest.java index e63d22a4..12031a35 100644 --- a/src/test/java/packetproxy/http2/frames/HeadersFrameTest.java +++ b/src/test/java/packetproxy/http2/frames/HeadersFrameTest.java @@ -29,8 +29,12 @@ public class HeadersFrameTest { private HpackDecoder decoder; public HeadersFrameTest() throws Exception { - decoder = new HpackDecoder(4096, 4096); - encoder = new HpackEncoder(4096, 4096); + decoder = new HpackDecoder(4096, System::nanoTime); + decoder.setMaxTableCapacity(4096); + decoder.setMaxHeaderListSize(4096); + encoder = new HpackEncoder(); + encoder.setMaxTableCapacity(4096); + encoder.setTableCapacity(4096); } @Test @@ -82,7 +86,9 @@ public void bigData() throws Exception { byte[] a = Hex.decodeHex( "3fe15f0085b8848d36a38264026e959d29ad171863c78f0bcc73cd415721e963c1639ebf5885aec3771a4b5f92497ca589d34d1f6a1271d882a60e1bf0acf7788ca47e561cc58190b6cb80003f008390692f96df3dbf4a082a693f750400bea01cb8cb5704053168df76036777735c82109b408cf2b794216aec3a4a4498f57f0130408bf2b4b60e92ac7ad263d48f89dd0e8c1ab6e4c5934f00874152b10e7ea62fcb0eb8b2c3b601002fac10ac20ac073ed42f9acd615106e1a7e941056be522c2005f500e5c65ab820298b46ffb52b1a67818fb5243d2335502f31cf35055c87a7ed4dc3a4bb8c92c151ea2ff40851d09591dc9ff07ed698907f371a699fe7ed4a47009b7c40003ed4ef07f2d39f4d33fcfd4ecadb00d820fe6e34d33fcfda948e0136f880007d4ecadb00d3f07f371a699fe7ed4a47009b7c40003ea7656d8069e83f9b8d34cff3f6a523804dbe20001f53b2b6c034e41fcdc69a67f9fb5291c026df10000fa9d95b601a660fe6e34d33fcfda948e0136f880007f" .toCharArray()); - HpackDecoder decoder = new HpackDecoder(65535, 65535); + HpackDecoder decoder = new HpackDecoder(65535, System::nanoTime); + decoder.setMaxTableCapacity(65535); + decoder.setMaxHeaderListSize(65535); ByteBuffer bb = ByteBuffer.allocate(4096); bb.put(a); bb.flip(); @@ -95,7 +101,9 @@ public void extraDataTest() throws Exception { byte[] frameData = Hex.decodeHex( "0001370104000000010085b8848d36a38264016e919d29ad171863c78f0bcc73cd415721e9635f92497ca589d34d1f6a1271d882a60e1bf0acf7008390692f96df697e940bea693f750400bea01cb816ae084a62d1bf6496df3dbf4a05f52f948a08017d4039702d5c1094c5a37f5891aed8e8313e94a47e561cc5804dbe20001f76036777735c821081408cf2b794216aec3a4a4498f57f0130408bf2b4b60e92ac7ad263d48f89dd0e8c1ab6e4c5934f40851d09591dc9ff07ed698907f371a699fe7ed4a47009b7c40003ed4ef07f2d39f4d33fcfd4ecadb00d820fe6e34d33fcfda948e0136f880007d4ecadb00d3f07f371a699fe7ed4a47009b7c40003ea7656d8069e83f9b8d34cff3f6a523804dbe20001f53b2b6c034e41fcdc69a67f9fb5291c026df10000fa9d95b601a660fe6e34d33fcfda948e0136f880007f" .toCharArray()); - HpackDecoder decoder = new HpackDecoder(65535, 65535); + HpackDecoder decoder = new HpackDecoder(65535, System::nanoTime); + decoder.setMaxTableCapacity(65535); + decoder.setMaxHeaderListSize(65535); HeadersFrame headerFrame = new HeadersFrame(frameData, decoder); System.out.println(new String(headerFrame.getExtra())); } @@ -105,7 +113,9 @@ public void initHttpTest() throws Exception { byte[] frameData = Hex.decodeHex( "0001370104000000010085b8848d36a38264016e919d29ad171863c78f0bcc73cd415721e9635f92497ca589d34d1f6a1271d882a60e1bf0acf7008390692f96df697e940bea693f750400bea01cb816ae084a62d1bf6496df3dbf4a05f52f948a08017d4039702d5c1094c5a37f5891aed8e8313e94a47e561cc5804dbe20001f76036777735c821081408cf2b794216aec3a4a4498f57f0130408bf2b4b60e92ac7ad263d48f89dd0e8c1ab6e4c5934f40851d09591dc9ff07ed698907f371a699fe7ed4a47009b7c40003ed4ef07f2d39f4d33fcfd4ecadb00d820fe6e34d33fcfda948e0136f880007d4ecadb00d3f07f371a699fe7ed4a47009b7c40003ea7656d8069e83f9b8d34cff3f6a523804dbe20001f53b2b6c034e41fcdc69a67f9fb5291c026df10000fa9d95b601a660fe6e34d33fcfda948e0136f880007f" .toCharArray()); - HpackDecoder decoder = new HpackDecoder(65535, 65535); + HpackDecoder decoder = new HpackDecoder(65535, System::nanoTime); + decoder.setMaxTableCapacity(65535); + decoder.setMaxHeaderListSize(65535); HeadersFrame headerFrame = new HeadersFrame(frameData, decoder); System.out.println(new String(headerFrame.getExtra())); } diff --git a/src/test/java/packetproxy/http3/QpackTest.java b/src/test/java/packetproxy/http3/QpackTest.java index a38e9d28..5300f8d6 100644 --- a/src/test/java/packetproxy/http3/QpackTest.java +++ b/src/test/java/packetproxy/http3/QpackTest.java @@ -29,12 +29,9 @@ public void smoke() throws Exception { ByteBufferPool bufferPool = new MappedByteBufferPool(); ByteBufferPool.Lease lease = new ByteBufferPool.Lease(bufferPool); - QpackEncoder encoder = new QpackEncoder(instructions -> { - instructions.forEach(i -> { - i.encode(lease); - }); - }, 100); - encoder.setCapacity(100); + QpackEncoder encoder = new QpackEncoder(instructions -> instructions.forEach(i -> i.encode(lease))); + encoder.setMaxTableCapacity(100); + encoder.setTableCapacity(100); HttpFields httpFields = HttpFields.build().add("hoge", "fuga"); @@ -64,14 +61,14 @@ public void smoke() throws Exception { ByteBufferPool bufferPool2 = new MappedByteBufferPool(); ByteBufferPool.Lease lease2 = new ByteBufferPool.Lease(bufferPool2); - QpackEncoder encoder = new QpackEncoder(instructions -> { - instructions.forEach(i -> i.encode(lease)); - }, 100); + QpackEncoder encoder = new QpackEncoder(instructions -> instructions.forEach(i -> i.encode(lease))); + encoder.setMaxTableCapacity(100); + encoder.setTableCapacity(100); - QpackDecoder decoder = new QpackDecoder(instructions -> { - instructions.forEach(i -> i.encode(lease2)); - }, 100); - encoder.setCapacity(100); + QpackDecoder decoder = new QpackDecoder(instructions -> instructions.forEach(i -> i.encode(lease2))); + decoder.setMaxHeadersSize(1024 * 1024); + decoder.setMaxTableCapacity(100); + decoder.setBeginNanoTimeSupplier(System::nanoTime); /* input data */ HttpFields httpFields = HttpFields.build().add("hoge", "fuga"); @@ -91,7 +88,7 @@ public void smoke() throws Exception { /* processing by Decoder */ decoder.parseInstructions(ByteBuffer.wrap(encoderInsts.toByteArray())); - decoder.decode(0, ByteBuffer.wrap(HeadersBytes), (streamId, metadata) -> { + decoder.decode(0, ByteBuffer.wrap(HeadersBytes), (streamId, metadata, wasBlocked) -> { System.out.println("streamId: " + streamId + ", meta: " + metadata); assertThat(httpFields.asImmutable()).isEqualTo(metadata.getFields()); });