AsamK / signal-cli

signal-cli provides an unofficial commandline, JSON-RPC and dbus interface for the Signal messenger.
GNU General Public License v3.0
3.2k stars 301 forks source link

FreeBSD and dbus-java support #1172

Open jsorocil opened 1 year ago

jsorocil commented 1 year ago

I am trying to use signal-cli v0.11.6 on FreeBSD

These are the steps which I tried:

prepare

export DIR=~/place-for-signal-cli

rm -rf $DIR/bin/signal-cli*
rm -rf $DIR/lib/*.so
rm -rf $DIR/lib/*.jar
set -e

cd ~/src/signal/

build signal-cli

cd signal-cli
git checkout -b v0.11.6 v0.11.6

./gradlew build
./gradlew installDist
./gradlew distTar
./gradlew fatJar

cp -f build/install/signal-cli/lib/* $DIR/lib/
cp -f build/install/signal-cli/bin/* $DIR/bin/
zip -d $DIR/lib/libsignal-client-*.jar libsignal_jni.so
cd ..

find libsignal version

ls signal-cli/build/install/signal-cli/lib/libsignal-client-0.21.1.jar
VERSION=0.21.1

build libsignal

cd libsignal
git checkout -b version-${VERSION} heads/v${VERSION}

sh java/build_jni.sh desktop
cp -f target/release/libsignal_jni.so $DIR/lib
cd ..

run it

export DISPLAY=0
export $(dbus-launch)
$DIR/bin/signal-cli daemon
exit

Result is:

INFO  DaemonCommand - Starting daemon in multi-account mode
INFO  TransportBuilder - Using transport dbus-java-transport-native-unixsocket to connect to unix:path=/tmp/dbus-DLPn5wJrTY,guid=39808c8d3a910014da961c3063d3b73a
Dbus command failed: Failed to connect to bus: Failed to authenticate

Verbose run:

export $(dbus-launch) ; ~/.opt/bin/signal-cli --verbose daemon
2023-01-27T13:36:36.765+0100 [main] DEBUG org.asamk.signal.util.IOUtils - XDG_RUNTIME_DIR not set, falling back to temp dir
2023-01-27T13:36:36.870+0100 [main] INFO  LibSignal - [libsignal]: rust/bridge/jni/src/logging.rs:156: Initializing libsignal version:0.21.1
2023-01-27T13:36:36.872+0100 [main] DEBUG org.asamk.signal.util.IOUtils - XDG_DATA_HOME not set, falling back to home dir
2023-01-27T13:36:37.137+0100 [main] INFO  com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
2023-01-27T13:36:37.239+0100 [main] INFO  com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection org.sqlite.jdbc4.JDBC4Connection@7e7b159b
2023-01-27T13:36:37.241+0100 [main] INFO  com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
2023-01-27T13:36:38.980+0100 [main] INFO  LibSignal - [libsignal]: rust/protocol/src/session_cipher.rs:59: Building PreKeyWhisperMessage for: 5a71a5c7-1043-4eb6-a36f-ab3d32b63ee9.1 with preKeyId: 8761196
2023-01-27T13:36:39.001+0100 [main] INFO  LibSignal - [libsignal]: rust/protocol/src/session_cipher.rs:59: Building PreKeyWhisperMessage for: 5a71a5c7-1043-4eb6-a36f-ab3d32b63ee9.3 with preKeyId: 9
2023-01-27T13:36:39.007+0100 [main] INFO  LibSignal - [libsignal]: rust/protocol/src/session_cipher.rs:59: Building PreKeyWhisperMessage for: 5a71a5c7-1043-4eb6-a36f-ab3d32b63ee9.4 with preKeyId: 10
2023-01-27T13:36:39.036+0100 [main] INFO  LibSignal - [SignalServiceMessageSender]: [sendMessage][1674822998964] Pipe unavailable, falling back... (WebSocketUnavailableException: WebSocket not currently available.)
2023-01-27T13:36:39.698+0100 [main] INFO  o.a.signal.commands.DaemonCommand - Starting daemon in multi-account mode
2023-01-27T13:36:39.720+0100 [receive-0] DEBUG o.asamk.signal.manager.ManagerImpl - Starting receiving messages
2023-01-27T13:36:39.728+0100 [receive-0] INFO  LibSignal - [WebSocketConnection]: [normal:1449947963] connect()
2023-01-27T13:36:39.754+0100 [receive-0] INFO  LibSignal - [WebSocketConnection]: [unidentified:179167134] connect()
2023-01-27T13:36:39.763+0100 [main] DEBUG o.f.d.c.transports.TransportBuilder - Found provider 'NativeTransportProvider' named 'dbus-java-transport-native-unixsocket' providing bustype 'UNIX'
2023-01-27T13:36:39.780+0100 [receive-0] DEBUG o.a.s.manager.helper.ReceiveHelper - Handling message actions
2023-01-27T13:36:39.791+0100 [receive-0] DEBUG o.a.s.manager.helper.ReceiveHelper - Checking for new message from server
2023-01-27T13:36:39.821+0100 [main] INFO  o.f.d.c.transports.TransportBuilder - Using transport dbus-java-transport-native-unixsocket to connect to unix:path=/tmp/dbus-qaF4psEgIX,guid=ae100427794883f98d32888063d3c553
2023-01-27T13:36:39.855+0100 [main] DEBUG o.f.d.c.impl.DBusConnection - Error creating transport
org.freedesktop.dbus.exceptions.AuthenticationException: Failed to authenticate
at org.freedesktop.dbus.connections.transports.AbstractTransport.authenticate(AbstractTransport.java:160)
at org.freedesktop.dbus.connections.transports.AbstractTransport.connect(AbstractTransport.java:133)
at org.freedesktop.dbus.connections.transports.TransportBuilder.build(TransportBuilder.java:335)
at org.freedesktop.dbus.connections.AbstractConnection.<init>(AbstractConnection.java:150)
at org.freedesktop.dbus.connections.impl.DBusConnection.<init>(DBusConnection.java:231)
at org.freedesktop.dbus.connections.impl.DBusConnectionBuilder.build(DBusConnectionBuilder.java:195)
at org.asamk.signal.commands.DaemonCommand.runDbus(DaemonCommand.java:385)
at org.asamk.signal.commands.DaemonCommand.runDbusMultiAccount(DaemonCommand.java:338)
at org.asamk.signal.commands.DaemonCommand.handleCommand(DaemonCommand.java:240)
at org.asamk.signal.App.handleMultiLocalCommand(App.java:317)
at org.asamk.signal.App.init(App.java:198)
at org.asamk.signal.Main.main(Main.java:60)
2023-01-27T13:36:39.859+0100 [main] DEBUG o.f.d.c.impl.DBusConnection - Ignoring disconnect, already disconnected
2023-01-27T13:36:39.860+0100 [main] DEBUG o.asamk.signal.manager.ManagerImpl - Receive stop requested, interrupting read from server.
2023-01-27T13:36:39.860+0100 [receive-0] DEBUG o.a.s.manager.helper.ReceiveHelper - Handling message actions
2023-01-27T13:36:39.861+0100 [receive-0] INFO  LibSignal - [WebSocketConnection]: [normal:1449947963] disconnect()
2023-01-27T13:36:39.862+0100 [receive-0] INFO  LibSignal - [WebSocketConnection]: [unidentified:179167134] disconnect()
2023-01-27T13:36:39.863+0100 [receive-0] DEBUG o.asamk.signal.manager.ManagerImpl - Finished receiving messages
2023-01-27T13:36:39.864+0100 [main] INFO  com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
2023-01-27T13:36:39.868+0100 [main] INFO  com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.
Dbus command failed: Failed to connect to bus: Failed to authenticate
org.freedesktop.dbus.exceptions.DBusException: Failed to connect to bus: Failed to authenticate
at org.freedesktop.dbus.connections.AbstractConnection.<init>(AbstractConnection.java:156)
at org.freedesktop.dbus.connections.impl.DBusConnection.<init>(DBusConnection.java:231)
at org.freedesktop.dbus.connections.impl.DBusConnectionBuilder.build(DBusConnectionBuilder.java:195)
at org.asamk.signal.commands.DaemonCommand.runDbus(DaemonCommand.java:385)
at org.asamk.signal.commands.DaemonCommand.runDbusMultiAccount(DaemonCommand.java:338)
at org.asamk.signal.commands.DaemonCommand.handleCommand(DaemonCommand.java:240)
at org.asamk.signal.App.handleMultiLocalCommand(App.java:317)
at org.asamk.signal.App.init(App.java:198)
at org.asamk.signal.Main.main(Main.java:60)
Caused by: org.freedesktop.dbus.exceptions.AuthenticationException: Failed to authenticate
at org.freedesktop.dbus.connections.transports.AbstractTransport.authenticate(AbstractTransport.java:160)
at org.freedesktop.dbus.connections.transports.AbstractTransport.connect(AbstractTransport.java:133)
at org.freedesktop.dbus.connections.transports.TransportBuilder.build(TransportBuilder.java:335)
at org.freedesktop.dbus.connections.AbstractConnection.<init>(AbstractConnection.java:150)
... 8 more

Does signal-cli newer than 0.9.0 works on FreeBSD? I am suspecting that issue is somewhere in dbus-java-transport-native-unixsocket but don't know how to debug it. Print "Failed to authenticate" is from: dbus-java-core/src/main/java/org/freedesktop/dbus/connections/transports/AbstractTransport.java

if (!sasl.auth(saslConfig, _sock, this))
    throw new AuthenticationException("Failed to authenticate");

This looks suspicious (but I don't know nor Java nor dbus): https://github.com/hypfvieh/dbus-java/blob/5077aa170fdaecfd984c6aacff89a97653f4717f/dbus-java-core/src/main/java/org/freedesktop/dbus/connections/SASL.java#L591

Is it possible to use signal-cli with dbus-java-jnr-unixsocket (instead of dbus-java-transport-native-unixsocket)?

AsamK commented 1 year ago

I'm not using FreeBSD, so I can't really support there. But using dbus-java-jnr-unixsocket should be straight forward, you just need to delete the dbus-java-transport-native-unixsocket-4.2.1.jar file in the lib folder and replace it with the jnr jar file of the same version.

An alternative would be to use the JSON-RPC daemon mode with --socket, --tcp or --http.

jsorocil commented 1 year ago

Something like should work?

rm $DIR/lib/dbus-java-transport-native-unixsocket*.jar
cd dbus-java/
git checkout -b v4.2.1 dbus-java-parent-4.2.1
cd dbus-java-transport-jnr-unixsocket
mvn compile package
cp target/dbus-java-transport-jnr-unixsocket*.jar $DIR/lib/

ls -lh $DIR/lib/dbus*
-rw-r--r--  1 user  user   299K Jan 27 12:36 $DIR/lib/dbus-java-core-4.2.1.jar
-rw-r--r--  1 user  user    12K Jan 28 10:20 $DIR/lib/dbus-java-transport-jnr-unixsocket-4.2.1.jar

export CLASSPATH=$CLASSPATH:$DIR/lib/

But in my case it doesn't find dbus-java-transport-jnr-unixsocket jar file:

export $(dbus-launch) ; $DIR/bin/signal-cli daemon
INFO  DaemonCommand - Starting daemon in multi-account mode
    java.lang.ExceptionInInitializerError
    at org.freedesktop.dbus.connections.impl.DBusConnectionBuilder.validateTransportAddress(DBusConnectionBuilder.java:129)
    at org.freedesktop.dbus.connections.impl.DBusConnectionBuilder.forSessionBus(DBusConnectionBuilder.java:43)
    at org.freedesktop.dbus.connections.impl.DBusConnectionBuilder.forType(DBusConnectionBuilder.java:89)
    at org.freedesktop.dbus.connections.impl.DBusConnectionBuilder.forType(DBusConnectionBuilder.java:76)
    at org.asamk.signal.commands.DaemonCommand.runDbus(DaemonCommand.java:385)
    at org.asamk.signal.commands.DaemonCommand.runDbusMultiAccount(DaemonCommand.java:338)
    at org.asamk.signal.commands.DaemonCommand.handleCommand(DaemonCommand.java:240)
    at org.asamk.signal.App.handleMultiLocalCommand(App.java:317)
    at org.asamk.signal.App.init(App.java:198)
at org.asamk.signal.Main.main(Main.java:60)
    Caused by: org.freedesktop.dbus.exceptions.TransportRegistrationException: No dbus-java-transport found in classpath, please add a transport module
    at org.freedesktop.dbus.connections.transports.TransportBuilder.getTransportProvider(TransportBuilder.java:63)
at org.freedesktop.dbus.connections.transports.TransportBuilder.<clinit>(TransportBuilder.java:35)
    ... 10 more

Trying that experiment but with dbus-java-transport-native-unixsocket:

cd ../dbus-java-transport-native-unixsocket
mvn compile package
cp target/dbus-java-transport-native-unixsocket-4.2.1.jar $DIR/lib/

export $(dbus-launch) ; $DIR/bin/signal-cli daemon
INFO  DaemonCommand - Starting daemon in multi-account mode
INFO  TransportBuilder - Using transport dbus-java-transport-native-unixsocket to connect to unix:path=/tmp/dbus-DTVeaPtnFC,guid=96911134315124498b9f3b7f63d4f3e9
Dbus command failed: Failed to connect to bus: Failed to authenticate

It does find dbus-java-transport-native-unixsocket installed into the same place (even it doesn't work which is expected).

AsamK commented 1 year ago

ah, you need to adapt the bin/signal-cli file, the CLASSPATH variable is set in there.

AsamK commented 1 year ago

Or if you're compiling signal-cli yourself, you can just edit the dependency in the build.gradle.kts file

jsorocil commented 1 year ago

After changing build.gradle.kts to:

implementation("com.github.hypfvieh", "dbus-java-transport-jnr-unixsocket", "4.2.1")

and rebuilding everything:

export $(dbus-launch) ; $DIR/bin/signal-cli daemon
INFO  DaemonCommand - Starting daemon in multi-account mode
INFO  TransportBuilder - Using transport dbus-java-transport-jnr-unixsocket to connect to unix:path=/tmp/dbus-KmhY9JsHea,guid=8b526cc280569f121b35e32e63d58493
Dbus command failed: Failed to connect to bus: Failed to authenticate

export $(dbus-launch) ; $DIR/bin/signal-cli --verbose daemon
2023-01-28T21:25:00.712+0100 [main] DEBUG org.asamk.signal.util.IOUtils - XDG_RUNTIME_DIR not set, falling back to temp dir
2023-01-28T21:25:00.800+0100 [main] INFO  LibSignal - [libsignal]: rust/bridge/jni/src/logging.rs:156: Initializing libsignal version:0.21.1
2023-01-28T21:25:00.800+0100 [main] DEBUG org.asamk.signal.util.IOUtils - XDG_DATA_HOME not set, falling back to home dir
2023-01-28T21:25:01.047+0100 [main] INFO  com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting...
2023-01-28T21:25:01.154+0100 [main] INFO  com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Added connection org.sqlite.jdbc4.JDBC4Connection@5829e4f4
2023-01-28T21:25:01.156+0100 [main] INFO  com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Start completed.
2023-01-28T21:25:02.944+0100 [main] INFO  LibSignal - [libsignal]: rust/protocol/src/session_cipher.rs:59: Building PreKeyWhisperMessage for: 5a71a5c7-1043-4eb6-a36f-ab3d32b63ee9.1 with preKeyId: 8761196
2023-01-28T21:25:02.963+0100 [main] INFO  LibSignal - [libsignal]: rust/protocol/src/session_cipher.rs:59: Building PreKeyWhisperMessage for: 5a71a5c7-1043-4eb6-a36f-ab3d32b63ee9.3 with preKeyId: 9
2023-01-28T21:25:02.970+0100 [main] INFO  LibSignal - [libsignal]: rust/protocol/src/session_cipher.rs:59: Building PreKeyWhisperMessage for: 5a71a5c7-1043-4eb6-a36f-ab3d32b63ee9.4 with preKeyId: 10
2023-01-28T21:25:03.002+0100 [main] INFO  LibSignal - [SignalServiceMessageSender]: [sendMessage][1674937502931] Pipe unavailable, falling back... (WebSocketUnavailableException: WebSocket not currently available.)
2023-01-28T21:25:03.552+0100 [main] INFO  o.a.signal.commands.DaemonCommand - Starting daemon in multi-account mode
2023-01-28T21:25:03.575+0100 [receive-0] DEBUG o.asamk.signal.manager.ManagerImpl - Starting receiving messages
2023-01-28T21:25:03.580+0100 [receive-0] INFO  LibSignal - [WebSocketConnection]: [normal:180088580] connect()
2023-01-28T21:25:03.594+0100 [receive-0] INFO  LibSignal - [WebSocketConnection]: [unidentified:313094353] connect()
2023-01-28T21:25:03.597+0100 [main] DEBUG o.f.d.c.transports.TransportBuilder - Found provider 'JnrUnixSocketTransportProvider' named 'dbus-java-transport-jnr-unixsocket' providing bustype 'UNIX'
2023-01-28T21:25:03.603+0100 [receive-0] DEBUG o.a.s.manager.helper.ReceiveHelper - Handling message actions
2023-01-28T21:25:03.604+0100 [receive-0] DEBUG o.a.s.manager.helper.ReceiveHelper - Checking for new message from server
2023-01-28T21:25:03.622+0100 [main] INFO  o.f.d.c.transports.TransportBuilder - Using transport dbus-java-transport-jnr-unixsocket to connect to unix:path=/tmp/dbus-B1FlRJS7M7,guid=f0d99b27bbd63e19050955b463d5849b
2023-01-28T21:25:03.879+0100 [main] DEBUG o.f.d.c.impl.DBusConnection - Error creating transport
    org.freedesktop.dbus.exceptions.AuthenticationException: Failed to authenticate
    at org.freedesktop.dbus.connections.transports.AbstractTransport.authenticate(AbstractTransport.java:160)
    at org.freedesktop.dbus.connections.transports.AbstractTransport.connect(AbstractTransport.java:133)
    at org.freedesktop.dbus.connections.transports.TransportBuilder.build(TransportBuilder.java:335)
    at org.freedesktop.dbus.connections.AbstractConnection.<init>(AbstractConnection.java:150)
    at org.freedesktop.dbus.connections.impl.DBusConnection.<init>(DBusConnection.java:231)
    at org.freedesktop.dbus.connections.impl.DBusConnectionBuilder.build(DBusConnectionBuilder.java:195)
    at org.asamk.signal.commands.DaemonCommand.runDbus(DaemonCommand.java:385)
    at org.asamk.signal.commands.DaemonCommand.runDbusMultiAccount(DaemonCommand.java:338)
    at org.asamk.signal.commands.DaemonCommand.handleCommand(DaemonCommand.java:240)
    at org.asamk.signal.App.handleMultiLocalCommand(App.java:317)
    at org.asamk.signal.App.init(App.java:198)
at org.asamk.signal.Main.main(Main.java:60)
    2023-01-28T21:25:03.881+0100 [main] DEBUG o.f.d.c.impl.DBusConnection - Ignoring disconnect, already disconnected
    2023-01-28T21:25:03.881+0100 [main] DEBUG o.asamk.signal.manager.ManagerImpl - Receive stop requested, interrupting read from server.
    2023-01-28T21:25:03.882+0100 [receive-0] DEBUG o.a.s.manager.helper.ReceiveHelper - Handling message actions
    2023-01-28T21:25:03.883+0100 [receive-0] INFO  LibSignal - [WebSocketConnection]: [normal:180088580] disconnect()
    2023-01-28T21:25:03.884+0100 [receive-0] INFO  LibSignal - [WebSocketConnection]: [unidentified:313094353] disconnect()
    2023-01-28T21:25:03.885+0100 [receive-0] DEBUG o.asamk.signal.manager.ManagerImpl - Finished receiving messages
    2023-01-28T21:25:03.885+0100 [main] INFO  com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown initiated...
    2023-01-28T21:25:03.888+0100 [main] INFO  com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Shutdown completed.
    Dbus command failed: Failed to connect to bus: Failed to authenticate
    org.freedesktop.dbus.exceptions.DBusException: Failed to connect to bus: Failed to authenticate
    at org.freedesktop.dbus.connections.AbstractConnection.<init>(AbstractConnection.java:156)
    at org.freedesktop.dbus.connections.impl.DBusConnection.<init>(DBusConnection.java:231)
    at org.freedesktop.dbus.connections.impl.DBusConnectionBuilder.build(DBusConnectionBuilder.java:195)
    at org.asamk.signal.commands.DaemonCommand.runDbus(DaemonCommand.java:385)
    at org.asamk.signal.commands.DaemonCommand.runDbusMultiAccount(DaemonCommand.java:338)
    at org.asamk.signal.commands.DaemonCommand.handleCommand(DaemonCommand.java:240)
    at org.asamk.signal.App.handleMultiLocalCommand(App.java:317)
    at org.asamk.signal.App.init(App.java:198)
at org.asamk.signal.Main.main(Main.java:60)
    Caused by: org.freedesktop.dbus.exceptions.AuthenticationException: Failed to authenticate
    at org.freedesktop.dbus.connections.transports.AbstractTransport.authenticate(AbstractTransport.java:160)
    at org.freedesktop.dbus.connections.transports.AbstractTransport.connect(AbstractTransport.java:133)
    at org.freedesktop.dbus.connections.transports.TransportBuilder.build(TransportBuilder.java:335)
at org.freedesktop.dbus.connections.AbstractConnection.<init>(AbstractConnection.java:150)
    ... 8 more
exquo commented 1 year ago

Don't know if it's any help, but there are other issues under the dbus-java issue label. (This issue should probably be labeled as well @AsamK)

As you probably know, there is a signal-cli's FreeBSD port maintained by @0mp, but the latest version there is 0.9.0, with the comment:

It would be great to update this port to the newest version available upstream. Unfortunately, I couldn't get the newer versions to work reliably on FreeBSD.