1
0
Fork 1
mirror of https://gitlab.com/mangadex-pub/mangadex_at_home.git synced 2024-01-19 02:48:37 +00:00

Merge branch 'update-everything' into 'master'

Update all the deps

See merge request mangadex-pub/mangadex_at_home!103
This commit is contained in:
carbotaniuman 2023-08-07 22:09:31 +00:00
commit 754c1de51d
12 changed files with 85 additions and 66 deletions

View file

@ -17,6 +17,12 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
### Security ### Security
## [2.0.4] - 2023-08-07
### Changed
- [2023-08-07] Updated dependencies [@carbotaniuman].
- [2023-04-06] Fixed DB contention issues [@carbotaniuman].
- [2023-04-06] Make errors more useful [@carbotaniuman].
## [2.0.3] - 2022-02-17 ## [2.0.3] - 2022-02-17
### Changed ### Changed
- [2022-02-17] Updated dependencies [@carbotaniuman]. - [2022-02-17] Updated dependencies [@carbotaniuman].
@ -411,7 +417,8 @@ This release contains many breaking changes! Of note are the changes to the cach
### Fixed ### Fixed
- [2020-06-11] Tweaked logging configuration to reduce log file sizes by [@carbotaniuman]. - [2020-06-11] Tweaked logging configuration to reduce log file sizes by [@carbotaniuman].
[Unreleased]: https://gitlab.com/mangadex/mangadex_at_home/-/compare/2.0.3...HEAD [Unreleased]: https://gitlab.com/mangadex/mangadex_at_home/-/compare/2.0.4...HEAD
[2.0.4]: https://gitlab.com/mangadex/mangadex_at_home/-/compare/2.0.3...2.0.4
[2.0.3]: https://gitlab.com/mangadex/mangadex_at_home/-/compare/2.0.2...2.0.3 [2.0.3]: https://gitlab.com/mangadex/mangadex_at_home/-/compare/2.0.2...2.0.3
[2.0.2]: https://gitlab.com/mangadex/mangadex_at_home/-/compare/2.0.1...2.0.2 [2.0.2]: https://gitlab.com/mangadex/mangadex_at_home/-/compare/2.0.1...2.0.2
[2.0.1]: https://gitlab.com/mangadex/mangadex_at_home/-/compare/2.0.0...2.0.1 [2.0.1]: https://gitlab.com/mangadex/mangadex_at_home/-/compare/2.0.0...2.0.1

View file

@ -1,12 +1,14 @@
import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
plugins { plugins {
id "jacoco" id "jacoco"
id "java" id "java"
id "org.jetbrains.kotlin.jvm" version "1.6.0" id "org.jetbrains.kotlin.jvm" version "1.8.0"
id "org.jetbrains.kotlin.kapt" version "1.6.0" id "org.jetbrains.kotlin.kapt" version "1.8.0"
id "application" id "application"
id "com.github.johnrengelman.shadow" version "7.0.0" id "com.github.johnrengelman.shadow" version "7.0.0"
id "com.diffplug.spotless" version "5.8.2" id "com.diffplug.spotless" version "5.8.2"
id "net.afanasev.sekret" version "0.1.1" id "net.afanasev.sekret" version "0.1.1-RC3"
id "com.palantir.git-version" version "0.12.3" id "com.palantir.git-version" version "0.12.3"
} }
@ -28,18 +30,16 @@ configurations {
dependencies { dependencies {
implementation "org.jetbrains.kotlin:kotlin-reflect" implementation "org.jetbrains.kotlin:kotlin-reflect"
compileOnly group: "net.afanasev", name: "sekret-annotation", version: "0.1.1"
implementation group: "commons-io", name: "commons-io", version: "2.11.0" implementation group: "commons-io", name: "commons-io", version: "2.11.0"
implementation group: "org.apache.commons", name: "commons-compress", version: "1.21" implementation group: "org.apache.commons", name: "commons-compress", version: "1.22"
implementation group: "ch.qos.logback", name: "logback-classic", version: "1.3.0-alpha4" implementation group: "ch.qos.logback", name: "logback-classic", version: "1.3.6"
implementation group: "io.micrometer", name: "micrometer-registry-prometheus", version: "1.8.3" implementation group: "io.micrometer", name: "micrometer-registry-prometheus", version: "1.8.3"
implementation group: "com.maxmind.geoip2", name: "geoip2", version: "2.15.0" implementation group: "com.maxmind.geoip2", name: "geoip2", version: "2.16.1"
implementation platform(group: "org.http4k", name: "http4k-bom", version: "4.19.3.0") implementation platform(group: "org.http4k", name: "http4k-bom", version: "4.41.3.0")
implementation platform(group: "com.fasterxml.jackson", name: "jackson-bom", version: "2.13.1") implementation platform(group: "com.fasterxml.jackson", name: "jackson-bom", version: "2.14.2")
implementation platform(group: "io.netty", name: "netty-bom", version: "4.1.74.Final") implementation platform(group: "io.netty", name: "netty-bom", version: "4.1.91.Final")
implementation group: "org.http4k", name: "http4k-core" implementation group: "org.http4k", name: "http4k-core"
implementation group: "org.http4k", name: "http4k-resilience4j" implementation group: "org.http4k", name: "http4k-resilience4j"
@ -52,12 +52,12 @@ dependencies {
implementation group: "org.http4k", name: "http4k-server-netty" implementation group: "org.http4k", name: "http4k-server-netty"
implementation group: "io.netty", name: "netty-codec-haproxy" implementation group: "io.netty", name: "netty-codec-haproxy"
implementation group: "io.netty", name: "netty-transport-native-epoll", classifier: "linux-x86_64" implementation group: "io.netty", name: "netty-transport-native-epoll", classifier: "linux-x86_64"
implementation group: "io.netty.incubator", name: "netty-incubator-transport-native-io_uring", version: "0.0.11.Final", classifier: "linux-x86_64" implementation group: "io.netty.incubator", name: "netty-incubator-transport-native-io_uring", version: "0.0.19.Final", classifier: "linux-x86_64"
testImplementation group: "org.http4k", name: "http4k-testing-kotest" testImplementation group: "org.http4k", name: "http4k-testing-kotest"
runtimeOnly group: "io.netty", name: "netty-tcnative-boringssl-static", version: "2.0.48.Final" runtimeOnly group: "io.netty", name: "netty-tcnative-boringssl-static", version: "2.0.59.Final"
implementation group: "com.zaxxer", name: "HikariCP", version: "4.0.3" implementation group: "com.zaxxer", name: "HikariCP", version: "4.0.3"
implementation group: "org.xerial", name: "sqlite-jdbc", version: "3.34.0" implementation group: "org.xerial", name: "sqlite-jdbc", version: "3.41.2.1"
implementation "org.ktorm:ktorm-core:$ktorm_version" implementation "org.ktorm:ktorm-core:$ktorm_version"
implementation "org.ktorm:ktorm-jackson:$ktorm_version" implementation "org.ktorm:ktorm-jackson:$ktorm_version"
@ -66,10 +66,10 @@ dependencies {
testImplementation "io.kotest:kotest-runner-junit5:$kotest_version" testImplementation "io.kotest:kotest-runner-junit5:$kotest_version"
testImplementation "io.kotest:kotest-assertions-core:$kotest_version" testImplementation "io.kotest:kotest-assertions-core:$kotest_version"
testImplementation "io.mockk:mockk:1.12.3" testImplementation "io.mockk:mockk:1.13.4"
} }
tasks.withType(Test) { tasks.withType(Test).configureEach {
useJUnitPlatform() useJUnitPlatform()
javaLauncher = javaToolchains.launcherFor { javaLauncher = javaToolchains.launcherFor {
languageVersion = JavaLanguageVersion.of(8) languageVersion = JavaLanguageVersion.of(8)
@ -91,14 +91,14 @@ kapt {
} }
java { java {
sourceCompatibility = JavaVersion.VERSION_1_8 toolchain {
targetCompatibility = JavaVersion.VERSION_1_8 languageVersion.set(JavaLanguageVersion.of(8))
}
} }
tasks.withType(org.jetbrains.kotlin.gradle.tasks.KotlinCompile).all { tasks.withType(KotlinCompile).configureEach {
kotlinOptions { compilerOptions {
freeCompilerArgs = ["-Xjsr305=strict"] freeCompilerArgs = ["-Xjsr305=strict"]
jvmTarget = "1.8"
} }
} }

View file

@ -1,3 +1,3 @@
kotest_version=5.1.0 kotest_version=5.5.5
ktorm_version=3.4.1 ktorm_version=3.6.0
picocli_version=4.6.3 picocli_version=4.7.1

Binary file not shown.

View file

@ -1,5 +1,5 @@
distributionBase=GRADLE_USER_HOME distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.1-bin.zip distributionUrl=https\://services.gradle.org/distributions/gradle-8.0.2-bin.zip
zipStoreBase=GRADLE_USER_HOME zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists zipStorePath=wrapper/dists

2
gradlew vendored
View file

@ -72,7 +72,7 @@ case "`uname`" in
Darwin* ) Darwin* )
darwin=true darwin=true
;; ;;
MINGW* ) MSYS* | MINGW* )
msys=true msys=true
;; ;;
NONSTOP* ) NONSTOP* )

21
gradlew.bat vendored
View file

@ -40,7 +40,7 @@ if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1 %JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init if "%ERRORLEVEL%" == "0" goto execute
echo. echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
@ -54,7 +54,7 @@ goto fail
set JAVA_HOME=%JAVA_HOME:"=% set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init if exist "%JAVA_EXE%" goto execute
echo. echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
@ -64,21 +64,6 @@ echo location of your Java installation.
goto fail goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute :execute
@rem Setup the command line @rem Setup the command line
@ -86,7 +71,7 @@ set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle @rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS% "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %*
:end :end
@rem End local scope for the variables with windows NT shell @rem End local scope for the variables with windows NT shell

View file

@ -95,9 +95,14 @@ class ImageStorage(
try { try {
val toUpdate = HashSet<String>() val toUpdate = HashSet<String>()
queue.drainTo(toUpdate) queue.drainTo(toUpdate)
val now = Instant.now()
if (toUpdate.isEmpty()) {
LOGGER.info { "Updating LRU times for ${toUpdate.size} entries" } LOGGER.info { "Updating LRU times for ${toUpdate.size} entries" }
} else {
LOGGER.info { "Skipping empty LRU update" }
}
val now = Instant.now()
if (databaseLock.tryLock(500, TimeUnit.MILLISECONDS)) { if (databaseLock.tryLock(500, TimeUnit.MILLISECONDS)) {
try { try {

View file

@ -20,7 +20,6 @@ package mdnet.settings
import com.fasterxml.jackson.databind.PropertyNamingStrategies import com.fasterxml.jackson.databind.PropertyNamingStrategies
import com.fasterxml.jackson.databind.annotation.JsonNaming import com.fasterxml.jackson.databind.annotation.JsonNaming
import net.afanasev.sekret.Secret
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy::class) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy::class)
data class ClientSettings( data class ClientSettings(
@ -33,7 +32,7 @@ data class ClientSettings(
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy::class) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy::class)
data class ServerSettings( data class ServerSettings(
@field:Secret val secret: String, val secret: String,
val externalPort: Int = 0, val externalPort: Int = 0,
val gracefulShutdownWaitSeconds: Int = 60, val gracefulShutdownWaitSeconds: Int = 60,
val hostname: String = "0.0.0.0", val hostname: String = "0.0.0.0",
@ -44,7 +43,11 @@ data class ServerSettings(
val port: Int = 443, val port: Int = 443,
val threads: Int = 0, val threads: Int = 0,
val enableProxyProtocol: Boolean = false, val enableProxyProtocol: Boolean = false,
) ) {
override fun toString(): String {
return "ServerSettings(secret=<redacted>, externalPort=$externalPort, gracefulShutdownWaitSeconds=$gracefulShutdownWaitSeconds, hostname='$hostname', maxKilobitsPerSecond=$maxKilobitsPerSecond, externalMaxKilobitsPerSecond=$externalMaxKilobitsPerSecond, maxMebibytesPerHour=$maxMebibytesPerHour, externalIp=$externalIp, port=$port, threads=$threads, enableProxyProtocol=$enableProxyProtocol)"
}
}
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy::class) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy::class)
data class DevSettings( data class DevSettings(
@ -57,5 +60,9 @@ data class DevSettings(
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy::class) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy::class)
data class MetricsSettings( data class MetricsSettings(
val enableGeoip: Boolean = false, val enableGeoip: Boolean = false,
@field:Secret val geoipLicenseKey: String = "none" val geoipLicenseKey: String = "none"
) ) {
override fun toString(): String {
return "MetricsSettings(enableGeoip=$enableGeoip, geoipLicenseKey=<redacted>)"
}
}

View file

@ -20,7 +20,6 @@ package mdnet.settings
import com.fasterxml.jackson.databind.PropertyNamingStrategies import com.fasterxml.jackson.databind.PropertyNamingStrategies
import com.fasterxml.jackson.databind.annotation.JsonNaming import com.fasterxml.jackson.databind.annotation.JsonNaming
import net.afanasev.sekret.Secret
import org.http4k.core.Uri import org.http4k.core.Uri
sealed class PingResult sealed class PingResult
@ -37,12 +36,13 @@ data class RemoteSettings(
val latestBuild: Int, val latestBuild: Int,
val url: Uri, val url: Uri,
val clientId: String, val clientId: String,
@field:Secret val tokenKey: ByteArray, val tokenKey: ByteArray,
val compromised: Boolean, val compromised: Boolean,
val paused: Boolean, val paused: Boolean,
val disableTokens: Boolean = false, val disableTokens: Boolean = false,
val tls: TlsCert? val tls: TlsCert?
) : PingResult() { ) : PingResult() {
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
if (this === other) return true if (this === other) return true
if (javaClass != other?.javaClass) return false if (javaClass != other?.javaClass) return false
@ -74,11 +74,19 @@ data class RemoteSettings(
result = 31 * result + (tls?.hashCode() ?: 0) result = 31 * result + (tls?.hashCode() ?: 0)
return result return result
} }
override fun toString(): String {
return "RemoteSettings(imageServer=$imageServer, latestBuild=$latestBuild, url=$url, clientId='$clientId', tokenKey=<redacted>, compromised=$compromised, paused=$paused, disableTokens=$disableTokens, tls=$tls)"
}
} }
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy::class) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy::class)
data class TlsCert( data class TlsCert(
val createdAt: String, val createdAt: String,
@field:Secret val privateKey: String, val privateKey: String,
@field:Secret val certificate: String val certificate: String
) ) {
override fun toString(): String {
return "TlsCert(createdAt='$createdAt', privateKey=<redacted>, certificate=<redacted>)"
}
}

View file

@ -20,20 +20,27 @@ package mdnet.settings
import com.fasterxml.jackson.databind.PropertyNamingStrategies import com.fasterxml.jackson.databind.PropertyNamingStrategies
import com.fasterxml.jackson.databind.annotation.JsonNaming import com.fasterxml.jackson.databind.annotation.JsonNaming
import net.afanasev.sekret.Secret
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy::class) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy::class)
data class SettingsRequest( data class SettingsRequest(
@field:Secret val secret: String, val secret: String,
val ipAddress: String?, val ipAddress: String?,
val port: Int, val port: Int,
val diskSpace: Long, val diskSpace: Long,
val networkSpeed: Long, val networkSpeed: Long,
val buildVersion: Int, val buildVersion: Int,
val tlsCreatedAt: String?, val tlsCreatedAt: String?,
) ) {
override fun toString(): String {
return "SettingsRequest(secret=<redacted>, ipAddress=$ipAddress, port=$port, diskSpace=$diskSpace, networkSpeed=$networkSpeed, buildVersion=$buildVersion, tlsCreatedAt=$tlsCreatedAt)"
}
}
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy::class) @JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy::class)
data class LogoutRequest( data class LogoutRequest(
@field:Secret val secret: String, val secret: String,
) ) {
override fun toString(): String {
return "LogoutRequest(secret=<redacted>)"
}
}

View file

@ -32,7 +32,7 @@ import io.kotest.matchers.nulls.shouldNotBeNull
import io.kotest.matchers.shouldBe import io.kotest.matchers.shouldBe
import org.apache.commons.io.IOUtils import org.apache.commons.io.IOUtils
import org.ktorm.database.Database import org.ktorm.database.Database
import kotlin.time.Duration import kotlin.time.Duration.Companion.minutes
import kotlin.time.ExperimentalTime import kotlin.time.ExperimentalTime
class ImageStorageTest : FreeSpec() { class ImageStorageTest : FreeSpec() {
@ -177,7 +177,7 @@ class ImageStorageSlowTest : FreeSpec() {
writer.stream.write(ByteArray(4096)) writer.stream.write(ByteArray(4096))
writer.commit(4096).shouldBeTrue() writer.commit(4096).shouldBeTrue()
eventually(Duration.minutes(5)) { eventually(5.minutes) {
imageStorage.size.shouldBeGreaterThan(0) imageStorage.size.shouldBeGreaterThan(0)
} }
} }
@ -193,7 +193,7 @@ class ImageStorageSlowTest : FreeSpec() {
writer.commit(8192).shouldBeTrue() writer.commit(8192).shouldBeTrue()
imageStorage.calculateSize() imageStorage.calculateSize()
eventually(Duration.minutes(5)) { eventually(5.minutes) {
imageStorage.size.shouldBeZero() imageStorage.size.shouldBeZero()
} }
} }