From 23b0af17311ffbfe36e2c254f21e2b09ee215e3f Mon Sep 17 00:00:00 2001 From: Sergey Karmanov Date: Sun, 19 Dec 2021 23:46:30 +0300 Subject: [PATCH 1/3] =?UTF-8?q?Update=20log4j=20dependency=20to=20version?= =?UTF-8?q?=202.17.0=20=F0=9F=98=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix for CVE-2021-45105 --- build.gradle | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build.gradle b/build.gradle index fffa45c..0d4c479 100644 --- a/build.gradle +++ b/build.gradle @@ -66,8 +66,8 @@ dependencies { // Log4j // A logging library - implementation 'org.apache.logging.log4j:log4j-api:2.16.0' - implementation 'org.apache.logging.log4j:log4j-core:2.16.0' + implementation 'org.apache.logging.log4j:log4j-api:2.17.0' + implementation 'org.apache.logging.log4j:log4j-core:2.17.0' // JUnit // A unit-testing library From f3504679420b603c5a27a3004e941a325a6f9b87 Mon Sep 17 00:00:00 2001 From: OLEGSHA Date: Tue, 21 Dec 2021 00:13:04 +0300 Subject: [PATCH 2/3] Removed jCenter(); formatted build.gradle - Fixed #23 - Fixed whitespace in build.gradle --- build.gradle | 242 ++++++++++++++++++++++++++------------------------- 1 file changed, 124 insertions(+), 118 deletions(-) diff --git a/build.gradle b/build.gradle index 0d4c479..d69d6a8 100644 --- a/build.gradle +++ b/build.gradle @@ -3,14 +3,14 @@ */ plugins { - // Apply the java-library plugin to add support for Java Library - id 'java-library' - - /* - * Uncomment the following line to enable the Eclipse plugin. - * This is only necessary if you don't use Buildship plugin from the IDE - */ - //id 'eclipse' + // Apply the java-library plugin to add support for Java Library + id 'java-library' + + /* + * Uncomment the following line to enable the Eclipse plugin. + * This is only necessary if you don't use Buildship plugin from the IDE + */ + //id 'eclipse' } java { @@ -18,8 +18,8 @@ java { * We're Java 8 for now. * Why? As of 2020, most users have Oracle Java, which only supports Java 8. */ - sourceCompatibility = JavaVersion.VERSION_1_8 - targetCompatibility = JavaVersion.VERSION_1_8 + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 } compileJava { @@ -29,9 +29,9 @@ compileJava { * However, on JDK 9 and later versions, '--release' option is required, * which is missing on JDK 8. */ - if (JavaVersion.current() != JavaVersion.VERSION_1_8) { - options.compilerArgs.addAll(['--release', '8']) - } + if (JavaVersion.current() != JavaVersion.VERSION_1_8) { + options.compilerArgs.addAll(['--release', '8']) + } } /* @@ -40,29 +40,28 @@ compileJava { repositories { mavenCentral() - jcenter() - - /* - * Specify Windcorp Maven repository - * Currently used by: - * - ru.windcorp.fork.io.github.java-graphics:glm:1.0.1 - */ - maven { url 'https://windcorp.ru/./maven' } + + /* + * Specify Windcorp Maven repository + * Currently used by: + * - ru.windcorp.fork.io.github.java-graphics:glm:1.0.1 + */ + maven { url 'https://windcorp.ru/./maven' } } dependencies { // Google Guava // A generic utilities library - implementation 'com.google.guava:guava:30.0-jre' - - // Trove4j - // Provides optimized Collections for primitive types - implementation 'net.sf.trove4j:trove4j:3.0.3' - - // java-graphics - // A GLM (OpenGL Mathematics) port to Java - // Unfortunately, Maven Central Repository provides an outdated version of this library, which contains several critical bugs - implementation 'ru.windcorp.fork.io.github.java-graphics:glm:1.0.1' + implementation 'com.google.guava:guava:30.0-jre' + + // Trove4j + // Provides optimized Collections for primitive types + implementation 'net.sf.trove4j:trove4j:3.0.3' + + // java-graphics + // A GLM (OpenGL Mathematics) port to Java + // Unfortunately, Maven Central Repository provides an outdated version of this library, which contains several critical bugs + implementation 'ru.windcorp.fork.io.github.java-graphics:glm:1.0.1' // Log4j // A logging library @@ -72,7 +71,7 @@ dependencies { // JUnit // A unit-testing library testImplementation 'junit:junit:4.13.2' - + // See LWJGL dependencies below } @@ -99,8 +98,8 @@ switch (OperatingSystem.current()) { case OperatingSystem.LINUX: def osArch = System.getProperty("os.arch") project.ext.lwjglNatives = osArch.startsWith("arm") || osArch.startsWith("aarch64") - ? "natives-linux-${osArch.contains("64") || osArch.startsWith("armv8") ? "arm64" : "arm32"}" - : "natives-linux" + ? "natives-linux-${osArch.contains("64") || osArch.startsWith("armv8") ? "arm64" : "arm32"}" + : "natives-linux" break case OperatingSystem.MAC_OS: project.ext.lwjglNatives = "natives-macos" @@ -118,12 +117,12 @@ dependencies { implementation "org.lwjgl:lwjgl-openal" implementation "org.lwjgl:lwjgl-opengl" implementation "org.lwjgl:lwjgl-stb" - + runtimeOnly "org.lwjgl:lwjgl::$lwjglNatives" - runtimeOnly "org.lwjgl:lwjgl-glfw::$lwjglNatives" - runtimeOnly "org.lwjgl:lwjgl-openal::$lwjglNatives" - runtimeOnly "org.lwjgl:lwjgl-opengl::$lwjglNatives" - runtimeOnly "org.lwjgl:lwjgl-stb::$lwjglNatives" + runtimeOnly "org.lwjgl:lwjgl-glfw::$lwjglNatives" + runtimeOnly "org.lwjgl:lwjgl-openal::$lwjglNatives" + runtimeOnly "org.lwjgl:lwjgl-opengl::$lwjglNatives" + runtimeOnly "org.lwjgl:lwjgl-stb::$lwjglNatives" } // LWJGL END @@ -141,49 +140,56 @@ project.ext.platforms = new HashSet<>() task addNativeDependencies { doFirst { def archs = project.ext.platforms - + switch (archs.size()) { - case 0: - println "Adding LWJGL native dependencies for local platform only:\n\t$lwjglNatives" - archs.add project.ext.lwjglNatives - break - case 1: - println "Adding LWJGL native dependencies for platform\n\t" + archs.get(0) - break - default: - println "Adding LWJGL native dependencies for platforms:\n\t" + archs.join("\n\t") + case 0: + println "Adding LWJGL native dependencies for local platform only:\n\t$lwjglNatives" + archs.add project.ext.lwjglNatives + break + case 1: + println "Adding LWJGL native dependencies for platform\n\t" + archs.get(0) + break + default: + println "Adding LWJGL native dependencies for platforms:\n\t" + archs.join("\n\t") } - + if (project.ext.lwjglNatives.isEmpty()) println "WTF" - + dependencies { archs.each { arch -> - runtimeOnly "org.lwjgl:lwjgl::$arch" - runtimeOnly "org.lwjgl:lwjgl-glfw::$arch" - runtimeOnly "org.lwjgl:lwjgl-openal::$arch" - runtimeOnly "org.lwjgl:lwjgl-opengl::$arch" - runtimeOnly "org.lwjgl:lwjgl-stb::$arch" - } - } - } + runtimeOnly "org.lwjgl:lwjgl::$arch" + runtimeOnly "org.lwjgl:lwjgl-glfw::$arch" + runtimeOnly "org.lwjgl:lwjgl-openal::$arch" + runtimeOnly "org.lwjgl:lwjgl-opengl::$arch" + runtimeOnly "org.lwjgl:lwjgl-stb::$arch" + } + } + } } compileJava.mustRunAfter addNativeDependencies // Make sure runtimeOnly has not been resolved task requestLinuxDependencies { - description 'Adds linux, linux-arm64 and linux-arm32 native libraries to built artifacts.' + description 'Adds linux, linux-arm64 and linux-arm32 native libraries to built artifacts.' doFirst { - project.ext.platforms.addAll(['natives-linux', 'natives-linux-arm64', 'natives-linux-arm32']) + project.ext.platforms.addAll([ + 'natives-linux', + 'natives-linux-arm64', + 'natives-linux-arm32' + ]) } } task requestWindowsDependencies { - description 'Adds windows and windows-x86 native libraries to built artifacts.' + description 'Adds windows and windows-x86 native libraries to built artifacts.' doFirst { - project.ext.platforms.addAll(['natives-windows', 'natives-windows-x86']) + project.ext.platforms.addAll([ + 'natives-windows', + 'natives-windows-x86' + ]) } } task requestMacOSDependencies { - description 'Adds macos native libraries to built artifacts.' + description 'Adds macos native libraries to built artifacts.' doFirst { project.ext.platforms.addAll(['natives-macos']) } @@ -192,7 +198,7 @@ task requestMacOSDependencies { def dependencySpecificationTasks = tasks.findAll { task -> task.name.startsWith('request') && task.name.endsWith('Dependencies') } task requestCrossPlatformDependencies { - description 'Adds native libraries for all available platforms to built artifacts.' + description 'Adds native libraries for all available platforms to built artifacts.' dependsOn dependencySpecificationTasks } @@ -205,7 +211,7 @@ def isDependencyRequested(String dep) { if (dep.endsWith(".jar")) { dep = dep.substring(0, dep.length() - ".jar".length()) } - + return !dep.contains("natives-") || project.ext.platforms.contains(dep.substring(dep.indexOf("natives-"), dep.length())) } @@ -219,7 +225,7 @@ task specifyLocalManifest { doFirst { def classPath = [] - + configurations.runtimeClasspath.each { if (isDependencyRequested(it.getName())) { classPath.add("lib/" + it.getName()) @@ -227,18 +233,18 @@ task specifyLocalManifest { println "\tRemoving from JAR classpath (not requested): " + it.getName() } } - + if (classPath.size() == configurations.runtimeClasspath.size()) { println "Nothing removed from JAR classpath" } - + jar { - manifest { - attributes( - "Main-Class": "ru.windcorp.progressia.client.ProgressiaClientMain", - "Class-Path": configurations.runtimeClasspath.collect { "lib/" + it.getName() } .findAll { isDependencyRequested(it) } .join(' ') - ) - } + manifest { + attributes( + "Main-Class": "ru.windcorp.progressia.client.ProgressiaClientMain", + "Class-Path": configurations.runtimeClasspath.collect { "lib/" + it.getName() } .findAll { isDependencyRequested(it) } .join(' ') + ) + } } } } @@ -248,13 +254,13 @@ jar.dependsOn specifyLocalManifest /* * Library export */ - + task exportLibs(type: Sync) { mustRunAfter addNativeDependencies - into libsDirectory.get().getAsFile().getPath() + "/lib" - exclude { !isDependencyRequested(it.getName()) } - from configurations.runtimeClasspath + into libsDirectory.get().getAsFile().getPath() + "/lib" + exclude { !isDependencyRequested(it.getName()) } + from configurations.runtimeClasspath } jar.dependsOn(exportLibs) @@ -264,52 +270,52 @@ jar.dependsOn(exportLibs) */ task packageDebian(type: Exec) { - description 'Builds the project and creates a Debain package.' - group 'Progressia' - - dependsOn build - dependsOn requestLinuxDependencies - - commandLine './buildPackages.sh', 'debian' - - doLast { - println "Debian package available in build_packages/" - } + description 'Builds the project and creates a Debain package.' + group 'Progressia' + + dependsOn build + dependsOn requestLinuxDependencies + + commandLine './buildPackages.sh', 'debian' + + doLast { + println "Debian package available in build_packages/" + } } task packageWindows(type: Exec) { - description 'Builds the project and creates a Windows installer.' - group 'Progressia' - - dependsOn build - dependsOn requestWindowsDependencies - - commandLine './buildPackages.sh', 'windows' - - doLast { - println "Windows installer available in build_packages/" - } + description 'Builds the project and creates a Windows installer.' + group 'Progressia' + + dependsOn build + dependsOn requestWindowsDependencies + + commandLine './buildPackages.sh', 'windows' + + doLast { + println "Windows installer available in build_packages/" + } } task buildCrossPlatform { - description 'Builds the project including native libraries for all available platforms.' - group 'Progressia' - - dependsOn requestCrossPlatformDependencies - dependsOn build - - doLast { - println "Native libraries for all platforms have been added" - } + description 'Builds the project including native libraries for all available platforms.' + group 'Progressia' + + dependsOn requestCrossPlatformDependencies + dependsOn build + + doLast { + println "Native libraries for all platforms have been added" + } } task buildLocal { - description "Builds the project including only native libraries for current platform ($lwjglNatives)." - group 'Progressia' - - dependsOn build - - doLast { - println "Native libraries only for platform $lwjglNatives have been added" - } + description "Builds the project including only native libraries for current platform ($lwjglNatives)." + group 'Progressia' + + dependsOn build + + doLast { + println "Native libraries only for platform $lwjglNatives have been added" + } } From 92f9639c4bd79f75a6b96dc9124d3c609ccc6ad6 Mon Sep 17 00:00:00 2001 From: OLEGSHA Date: Tue, 21 Dec 2021 00:31:35 +0300 Subject: [PATCH 3/3] Improved input event handling - Added Component.passInputToChildren() - Input events can now be processed in parallel or recursively --- .../client/graphics/gui/Component.java | 4 +++ .../client/graphics/gui/GUILayer.java | 27 +++++++++++-------- 2 files changed, 20 insertions(+), 11 deletions(-) diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/gui/Component.java b/src/main/java/ru/windcorp/progressia/client/graphics/gui/Component.java index 417c6ea..115594b 100644 --- a/src/main/java/ru/windcorp/progressia/client/graphics/gui/Component.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/gui/Component.java @@ -562,6 +562,10 @@ public class Component extends Named { } } + protected boolean passInputToChildren(InputEvent e) { + return true; + } + InputBus getInputBus() { return inputBus; } diff --git a/src/main/java/ru/windcorp/progressia/client/graphics/gui/GUILayer.java b/src/main/java/ru/windcorp/progressia/client/graphics/gui/GUILayer.java index b808aed..1fa73bf 100755 --- a/src/main/java/ru/windcorp/progressia/client/graphics/gui/GUILayer.java +++ b/src/main/java/ru/windcorp/progressia/client/graphics/gui/GUILayer.java @@ -27,6 +27,7 @@ import ru.windcorp.progressia.client.graphics.flat.RenderTarget; import ru.windcorp.progressia.client.graphics.input.InputEvent; import ru.windcorp.progressia.client.graphics.input.KeyEvent; import ru.windcorp.progressia.client.graphics.input.bus.InputBus; +import ru.windcorp.progressia.common.util.LowOverheadCache; import ru.windcorp.progressia.common.util.StashingStack; public abstract class GUILayer extends AssembledFlatLayer { @@ -40,7 +41,7 @@ public abstract class GUILayer extends AssembledFlatLayer { public GUILayer(String name, Layout layout) { super(name); - + getRoot().setLayout(layout); getRoot().addInputListener(KeyEvent.class, this::attemptFocusTransfer, InputBus.Option.IGNORE_FOCUS); } @@ -75,20 +76,22 @@ public abstract class GUILayer extends AssembledFlatLayer { } /** - * Stack for {@link #handleInput(InputEvent)}. + * Stacks for {@link #handleInput(InputEvent)}. */ - private StashingStack path = new StashingStack<>(64, EventHandlingFrame::new); - + private final LowOverheadCache> pathCache = new LowOverheadCache<>( + () -> new StashingStack<>(64, EventHandlingFrame::new) + ); + /* * This is essentially a depth-first iteration of the component tree. The * recursive procedure has been unrolled to reduce call stack length. */ @Override public void handleInput(InputEvent event) { + StashingStack path = pathCache.grab(); + if (!path.isEmpty()) { - throw new IllegalStateException( - "path is not empty: " + path + ". Are events being processed concurrently?" - ); + throw new IllegalStateException("path is not empty: " + path); } path.push().init(root); @@ -101,7 +104,7 @@ public abstract class GUILayer extends AssembledFlatLayer { Component c = it.next(); if (c.isEnabled()) { - if (c.getChildren().isEmpty()) { + if (c.getChildren().isEmpty() || !c.passInputToChildren(event)) { c.getInputBus().dispatch(event); } else { path.push().init(c); @@ -114,15 +117,17 @@ public abstract class GUILayer extends AssembledFlatLayer { } } + + pathCache.release(path); } - + private void attemptFocusTransfer(KeyEvent e) { Component focused = getRoot().findFocused(); - + if (focused == null) { return; } - + if (e.getKey() == GLFW.GLFW_KEY_TAB && !e.isRelease()) { e.consume(); if (e.hasShift()) {