From fd7d4aca96ab9c34d8dd9081843d93658aceba0d Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Sat, 28 Feb 2026 06:03:39 -0500 Subject: [PATCH 1/3] fix: build signal-cli from master to fix Signal Desktop v8.0.0 binary ACI Signal Desktop v8.0.0 switched to binary ACI encoding which breaks reactions, mentions, and quotes in signal-cli v0.13.24. The signal-cli master branch already includes the fix (signal-service-java unofficial_138 with dual-format ACI parsing), so building from master on x86_64 resolves all three issues without needing a patch. Changes: - Build from signal-cli master instead of v0.13.24 tag on x86_64 - Use installDist output as the main signal-cli installation - Detect libsignal-client jar version dynamically (master uses 0.87.1) - Update signal-cli-native.patch for master's build.gradle.kts - Move BaseConfig/libsignal workarounds behind arch guard (arm64/armv7 only) Supersedes #799 (patch-based approach). Co-Authored-By: Claude Opus 4.6 --- Dockerfile | 39 ++++++++++++------- .../libsignal-client/signal-cli-native.patch | 13 +++---- 2 files changed, 30 insertions(+), 22 deletions(-) diff --git a/Dockerfile b/Dockerfile index 96e845b..abc8ea5 100644 --- a/Dockerfile +++ b/Dockerfile @@ -74,18 +74,20 @@ RUN if [ "$(uname -m)" = "x86_64" ]; then \ cd /tmp \ && git clone https://github.com/AsamK/signal-cli.git signal-cli-${SIGNAL_CLI_VERSION}-source \ && cd signal-cli-${SIGNAL_CLI_VERSION}-source \ - && git checkout -q v${SIGNAL_CLI_VERSION} \ && cd /tmp && mkdir -p /tmp/graalvm && tar xf gvm.tar.gz -C /tmp/graalvm --strip-components=1 \ && export GRAALVM_HOME=/tmp/graalvm \ && export PATH=/tmp/graalvm/bin:$PATH \ && cd /tmp/signal-cli-${SIGNAL_CLI_VERSION}-source \ - && sed -i 's/Signal-Android\/5.22.3/Signal-Android\/5.51.7/g' src/main/java/org/asamk/signal/BaseConfig.java \ && ./gradlew build \ && ./gradlew installDist \ - && ls build/install/signal-cli/lib/libsignal-client-${LIBSIGNAL_CLIENT_VERSION}.jar || (echo "\n\nsignal-client jar file with version ${LIBSIGNAL_CLIENT_VERSION} not found. Maybe the version needs to be bumped in the signal-cli-rest-api Dockerfile?\n\n" && echo "Available version: \n" && ls build/install/signal-cli/lib/libsignal-client-* && echo "\n\n" && exit 1) \ + && BUILT_LIBSIGNAL_JAR=$(ls build/install/signal-cli/lib/ | grep 'libsignal-client-.*\.jar' | head -1) \ + && echo "Built libsignal-client jar: ${BUILT_LIBSIGNAL_JAR}" \ + && rm -rf /tmp/signal-cli-${SIGNAL_CLI_VERSION} \ + && cp -a build/install/signal-cli /tmp/signal-cli-${SIGNAL_CLI_VERSION} \ && cd /tmp \ - && cp signal-cli-${SIGNAL_CLI_VERSION}-source/build/install/signal-cli/lib/libsignal-client-${LIBSIGNAL_CLIENT_VERSION}.jar libsignal-client.jar \ + && cp /tmp/signal-cli-${SIGNAL_CLI_VERSION}/lib/${BUILT_LIBSIGNAL_JAR} libsignal-client.jar \ && zip -qu libsignal-client.jar libsignal_jni.so \ + && cp libsignal-client.jar /tmp/signal-cli-${SIGNAL_CLI_VERSION}/lib/${BUILT_LIBSIGNAL_JAR} \ && cd /tmp/signal-cli-${SIGNAL_CLI_VERSION}-source \ && git apply /tmp/signal-cli-native.patch \ && ./gradlew -q nativeCompile; \ @@ -113,20 +115,27 @@ RUN if [ "$(uname -m)" = "x86_64" ]; then \ echo "Unknown architecture"; \ fi; -# replace libsignal-client +# Post-processing: inject native libsignal_jni.so and apply BaseConfig workaround. +# On x86_64 the source build (above) already produced a patched installDist with +# the native lib injected, so we only need to package it. On other architectures +# the release tarball is still used — apply the BaseConfig sed workaround and +# inject the native lib there. -RUN ls /tmp/signal-cli-${SIGNAL_CLI_VERSION}/lib/libsignal-client-${LIBSIGNAL_CLIENT_VERSION}.jar || (echo "\n\nsignal-client jar file with version ${LIBSIGNAL_CLIENT_VERSION} not found. Maybe the version needs to be bumped in the signal-cli-rest-api Dockerfile?\n\n" && echo "Available version: \n" && ls /tmp/signal-cli-${SIGNAL_CLI_VERSION}/lib/libsignal-client-* && echo "\n\n" && exit 1) - -# workaround until upstream is fixed -RUN cd /tmp/signal-cli-${SIGNAL_CLI_VERSION}/lib \ - && unzip signal-cli-${SIGNAL_CLI_VERSION}.jar \ - && sed -i 's/Signal-Android\/5.22.3/Signal-Android\/5.51.7/g' org/asamk/signal/BaseConfig.class \ - && zip -r signal-cli-${SIGNAL_CLI_VERSION}.jar org/ META-INF/ \ - && rm -rf META-INF \ - && rm -rf org +RUN if [ "$(uname -m)" != "x86_64" ]; then \ + ls /tmp/signal-cli-${SIGNAL_CLI_VERSION}/lib/libsignal-client-${LIBSIGNAL_CLIENT_VERSION}.jar \ + || (echo "\n\nsignal-client jar file with version ${LIBSIGNAL_CLIENT_VERSION} not found.\n\n" \ + && ls /tmp/signal-cli-${SIGNAL_CLI_VERSION}/lib/libsignal-client-* && exit 1) \ + && cd /tmp/signal-cli-${SIGNAL_CLI_VERSION}/lib \ + && unzip signal-cli-${SIGNAL_CLI_VERSION}.jar \ + && sed -i 's/Signal-Android\/5.22.3/Signal-Android\/5.51.7/g' org/asamk/signal/BaseConfig.class \ + && zip -r signal-cli-${SIGNAL_CLI_VERSION}.jar org/ META-INF/ \ + && rm -rf META-INF \ + && rm -rf org \ + && cd /tmp/ \ + && zip -qu /tmp/signal-cli-${SIGNAL_CLI_VERSION}/lib/libsignal-client-${LIBSIGNAL_CLIENT_VERSION}.jar libsignal_jni.so; \ + fi RUN cd /tmp/ \ - && zip -qu /tmp/signal-cli-${SIGNAL_CLI_VERSION}/lib/libsignal-client-${LIBSIGNAL_CLIENT_VERSION}.jar libsignal_jni.so \ && zip -qr signal-cli-${SIGNAL_CLI_VERSION}.zip signal-cli-${SIGNAL_CLI_VERSION}/* \ && unzip -q /tmp/signal-cli-${SIGNAL_CLI_VERSION}.zip -d /opt \ && rm -f /tmp/signal-cli-${SIGNAL_CLI_VERSION}.zip diff --git a/ext/libraries/libsignal-client/signal-cli-native.patch b/ext/libraries/libsignal-client/signal-cli-native.patch index cf506f0..a14f065 100644 --- a/ext/libraries/libsignal-client/signal-cli-native.patch +++ b/ext/libraries/libsignal-client/signal-cli-native.patch @@ -1,23 +1,22 @@ diff --git a/build.gradle.kts b/build.gradle.kts -index f51d9f1c..6357f590 100644 --- a/build.gradle.kts +++ b/build.gradle.kts -@@ -55,6 +55,7 @@ dependencies { +@@ -89,6 +89,7 @@ dependencies { implementation(libs.slf4j.jul) implementation(libs.logback) + implementation(libs.zxing) implementation(project(":libsignal-cli")) + implementation(files("/tmp/libsignal-client.jar")) } - - configurations { -@@ -63,6 +64,10 @@ configurations { + +@@ -97,6 +98,10 @@ configurations { } } - + +configurations.all { + exclude(group = "org.signal", module = "libsignal-client") +} + - + tasks.withType().configureEach { isPreserveFileTimestamps = false From dd97a24d701ff5919642c7078453c7a319ad979d Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Sat, 28 Feb 2026 06:17:58 -0500 Subject: [PATCH 2/3] Bump GraalVM to 25.0.2 for signal-cli master (requires Java 25) signal-cli master's buildSrc requires Java 24, and the libsignal-cli subproject requires Java 25 for compilation. GraalVM 21.0.0 (Java 21) fails both checks. Bump to GraalVM Community Edition 25.0.2 (JDK 25). The native binary produced by GraalVM does not require a JRE at runtime, so openjdk-21-jre in the runtime image remains sufficient. Co-Authored-By: Claude Opus 4.6 --- Dockerfile | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index abc8ea5..bec387e 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,8 +3,7 @@ ARG LIBSIGNAL_CLIENT_VERSION=0.87.0 ARG SIGNAL_CLI_NATIVE_PACKAGE_VERSION=0.13.24+morph027+2 ARG SWAG_VERSION=1.16.4 -ARG GRAALVM_VERSION=21.0.0 -#ARG GRAALVM_VERSION=25.0.2 +ARG GRAALVM_VERSION=25.0.2 ARG BUILD_VERSION_ARG=unset From 32c793b2ebf32b8cf38190a174423157b4b62f80 Mon Sep 17 00:00:00 2001 From: Stephan Richter Date: Sat, 28 Feb 2026 07:18:44 -0500 Subject: [PATCH 3/3] fix: upgrade runtime to Ubuntu Noble + Java 25 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit signal-cli master (0.14.0-SNAPSHOT) is compiled with GraalVM 25 / Java 25. The JVM launcher (`signal-cli`) requires a Java 25 runtime, but the previous image used Ubuntu Jammy with openjdk-21-jre. - Base image: ubuntu:jammy → ubuntu:noble (24.04 LTS) - JRE: openjdk-21-jre → openjdk-25-jre - netcat → netcat-openbsd (no transitional package on Noble) - Remove default `ubuntu` user (UID/GID 1000 conflict on Noble) --- Dockerfile | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Dockerfile b/Dockerfile index bec387e..8c6b802 100644 --- a/Dockerfile +++ b/Dockerfile @@ -167,7 +167,7 @@ RUN cd /tmp/signal-cli-rest-api-src && go build -buildmode=plugin -o signal-cli- # is fixed we use the standard ubuntu image #FROM eclipse-temurin:21-jre-jammy -FROM ubuntu:jammy +FROM ubuntu:noble ENV GIN_MODE=release @@ -181,7 +181,7 @@ ENV SIGNAL_CLI_REST_API_PLUGIN_SHARED_OBJ_DIR=/usr/bin/ RUN dpkg-reconfigure debconf --frontend=noninteractive \ && apt-get update \ - && apt-get install -y --no-install-recommends util-linux supervisor netcat openjdk-21-jre curl locales \ + && apt-get install -y --no-install-recommends util-linux supervisor netcat-openbsd openjdk-25-jre curl locales \ && rm -rf /var/lib/apt/lists/* COPY --from=buildcontainer /tmp/signal-cli-rest-api-src/signal-cli-rest-api /usr/bin/signal-cli-rest-api @@ -192,7 +192,8 @@ COPY --from=buildcontainer /tmp/signal-cli-rest-api-src/signal-cli-rest-api_plug COPY entrypoint.sh /entrypoint.sh -RUN groupadd -g 1000 signal-api \ +RUN userdel -r ubuntu 2>/dev/null || true \ + && groupadd -f -g 1000 signal-api \ && useradd --no-log-init -M -d /home -s /bin/bash -u 1000 -g 1000 signal-api \ && ln -s /opt/signal-cli-${SIGNAL_CLI_VERSION}/bin/signal-cli /usr/bin/signal-cli \ && ln -s /opt/signal-cli-${SIGNAL_CLI_VERSION}/bin/signal-cli-native /usr/bin/signal-cli-native \