diff --git a/.github/ISSUE_TEMPLATE/bug-report.yml b/.github/ISSUE_TEMPLATE/bug-report.yml index 115a9e6..6c75f80 100644 --- a/.github/ISSUE_TEMPLATE/bug-report.yml +++ b/.github/ISSUE_TEMPLATE/bug-report.yml @@ -44,6 +44,7 @@ body: - Normal Mode - Native Mode - JSON-RPC Mode + - JSON-RPC-Native Mode - type: dropdown validations: required: true diff --git a/Dockerfile b/Dockerfile index 6e724f1..f7dfd57 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -ARG SIGNAL_CLI_VERSION=0.14.2 -ARG LIBSIGNAL_CLIENT_VERSION=0.90.0 -ARG SIGNAL_CLI_NATIVE_PACKAGE_VERSION=0.14.2+morph027+2 +ARG SIGNAL_CLI_VERSION=0.14.3 +ARG LIBSIGNAL_CLIENT_VERSION=0.92.1 +ARG SIGNAL_CLI_NATIVE_PACKAGE_VERSION=0.14.3+morph027+1 ARG SWAG_VERSION=1.16.4 ARG GRAALVM_VERSION=25.0.2 @@ -18,9 +18,19 @@ ARG GRAALVM_VERSION ARG BUILD_VERSION_ARG ARG SIGNAL_CLI_NATIVE_PACKAGE_VERSION -COPY ext/libraries/libsignal-client/v${LIBSIGNAL_CLIENT_VERSION} /tmp/libsignal-client-libraries +RUN dpkg-reconfigure debconf --frontend=noninteractive \ + && apt-get update \ + && apt-get -y install --no-install-recommends \ + wget git locales zip unzip \ + file build-essential libz-dev zlib1g-dev binutils \ + && rm -rf /var/lib/apt/lists/* + COPY ext/libraries/libsignal-client/signal-cli-native.patch /tmp/signal-cli-native.patch +#COPY ext/libraries/libsignal-client/v${LIBSIGNAL_CLIENT_VERSION} /tmp/libsignal-client-libraries +RUN wget https://github.com/bbernhard/libsignal-client-builds/releases/download/v${LIBSIGNAL_CLIENT_VERSION}/libsignal-client-build-v${LIBSIGNAL_CLIENT_VERSION}.tar.gz -O /tmp/libsignal-client.tar.gz +RUN cd /tmp && mkdir -p /tmp/libsignal-client-libraries && tar xf libsignal-client.tar.gz && mv x86-64 armv7 arm64 -t libsignal-client-libraries + # use architecture specific libsignal_jni.so RUN arch="$(uname -m)"; \ case "$arch" in \ @@ -30,13 +40,6 @@ RUN arch="$(uname -m)"; \ *) echo "Unknown architecture" && exit 1 ;; \ esac; -RUN dpkg-reconfigure debconf --frontend=noninteractive \ - && apt-get update \ - && apt-get -y install --no-install-recommends \ - wget git locales zip unzip \ - file build-essential libz-dev zlib1g-dev binutils \ - && rm -rf /var/lib/apt/lists/* - RUN sed -i -e 's/# en_US.UTF-8 UTF-8/en_US.UTF-8 UTF-8/' /etc/locale.gen && \ dpkg-reconfigure --frontend=noninteractive locales && \ update-locale LANG=en_US.UTF-8 @@ -96,11 +99,11 @@ RUN if [ "$(uname -m)" = "x86_64" ]; then \ && echo "deb [signed-by=/usr/share/keyrings/signal-cli-native.pgp] https://packaging.gitlab.io/signal-cli signalcli main" > /etc/apt/sources.list.d/morph027-signal-cli.list \ && mkdir -p /tmp/signal-cli-native \ && cd /tmp/signal-cli-native \ - #&& wget https://gitlab.com/packaging/signal-cli/-/jobs/3716873649/artifacts/download?file_type=archive -O /tmp/signal-cli-native/archive.zip \ - #&& unzip archive.zip \ - #&& mv signal-cli-native-arm64/*deb . \ - && apt-get update \ - && apt-get download signal-cli-native=${SIGNAL_CLI_NATIVE_PACKAGE_VERSION} \ + && wget https://gitlab.com/packaging/signal-cli/-/jobs/14049119045/artifacts/download?file_type=archive -O /tmp/signal-cli-native/archive.zip \ + && unzip archive.zip \ + && mv signal-cli-native-arm64-trigger/*deb . \ + #&& apt-get update \ + #&& apt-get download signal-cli-native=${SIGNAL_CLI_NATIVE_PACKAGE_VERSION} \ && ar x *.deb \ && tar xf data.tar.gz \ && mkdir -p /tmp/signal-cli-${SIGNAL_CLI_VERSION}-source/build/native/nativeCompile \ diff --git a/ext/libraries/libsignal-client/signal-cli-native.patch b/ext/libraries/libsignal-client/signal-cli-native.patch index 523471f..4afb248 100644 --- a/ext/libraries/libsignal-client/signal-cli-native.patch +++ b/ext/libraries/libsignal-client/signal-cli-native.patch @@ -1,16 +1,16 @@ diff --git a/build.gradle.kts b/build.gradle.kts -index 5d127e4c..7ca155f9 100644 +index 64e29294..5d0e53cc 100644 --- a/build.gradle.kts +++ b/build.gradle.kts -@@ -91,6 +91,7 @@ dependencies { - implementation(libs.logback) - implementation(libs.zxing) +@@ -104,6 +104,7 @@ dependencies { + implementation(libs.micronaut.json.schema.generator) + } implementation(project(":libsignal-cli")) -+ implementation(files("/tmp/libsignal-client.jar")) ++ implementation(files("/tmp/libsignal-client.jar")) testImplementation(libs.junit.jupiter) testImplementation(platform(libs.junit.jupiter.bom)) -@@ -107,6 +108,10 @@ configurations { +@@ -120,6 +121,10 @@ configurations { } } diff --git a/ext/libraries/libsignal-client/v0.92.1/arm64/libsignal_jni.so b/ext/libraries/libsignal-client/v0.92.1/arm64/libsignal_jni.so new file mode 100644 index 0000000..96b71b6 Binary files /dev/null and b/ext/libraries/libsignal-client/v0.92.1/arm64/libsignal_jni.so differ diff --git a/ext/libraries/libsignal-client/v0.92.1/armv7/libsignal_jni.so b/ext/libraries/libsignal-client/v0.92.1/armv7/libsignal_jni.so new file mode 100644 index 0000000..35d24ac Binary files /dev/null and b/ext/libraries/libsignal-client/v0.92.1/armv7/libsignal_jni.so differ diff --git a/ext/libraries/libsignal-client/v0.92.1/x86-64/libsignal_jni.so b/ext/libraries/libsignal-client/v0.92.1/x86-64/libsignal_jni.so new file mode 100644 index 0000000..bc5ed4e Binary files /dev/null and b/ext/libraries/libsignal-client/v0.92.1/x86-64/libsignal_jni.so differ diff --git a/src/api/api.go b/src/api/api.go index a3db628..3ec81a2 100644 --- a/src/api/api.go +++ b/src/api/api.go @@ -324,8 +324,14 @@ func (a *Api) RegisterNumber(c *gin.Context) { err = a.signalClient.RegisterNumber(number, req.UseVoice, req.Captcha) if err != nil { - c.JSON(400, gin.H{"error": err.Error()}) - return + switch err.(type) { + case *client.InvalidTransportError: + c.JSON(400, Error{Msg: "Couldn't use SMS verification to register the specified number. Wait 60 seconds and try again with {\"use_voice\": true}"}) + return + default: + c.JSON(400, Error{Msg: err.Error()}) + return + } } c.Writer.WriteHeader(201) } diff --git a/src/client/client.go b/src/client/client.go index 55671ee..5dc5985 100644 --- a/src/client/client.go +++ b/src/client/client.go @@ -749,6 +749,8 @@ func (s *SignalClient) About() About { } func (s *SignalClient) RegisterNumber(number string, useVoice bool, captcha string) error { + var err error + var jsonRpc2Client *JsonRpc2Client if s.signalCliMode == JsonRpc { type Request struct { UseVoice bool `json:"voice,omitempty"` @@ -765,12 +767,11 @@ func (s *SignalClient) RegisterNumber(number string, useVoice bool, captcha stri request.Captcha = captcha } - jsonRpc2Client, err := s.getJsonRpc2Client() + jsonRpc2Client, err = s.getJsonRpc2Client() if err != nil { return err } _, err = jsonRpc2Client.getRaw("register", nil, request) - return err } else { command := []string{"--config", s.signalCliConfig, "-a", number, "register"} @@ -782,9 +783,16 @@ func (s *SignalClient) RegisterNumber(number string, useVoice bool, captcha stri command = append(command, []string{"--captcha", captcha}...) } - _, err := s.cliClient.Execute(true, command, "") - return err + _, err = s.cliClient.Execute(true, command, "") } + + if err != nil { + if !useVoice && strings.Contains(err.Error(), "StatusCode: 400 (InvalidTransportModeException)") { + return &InvalidTransportError{Description: "Couldn't use SMS verification to register number."} + } + } + + return err } func (s *SignalClient) UnregisterNumber(number string, deleteAccount bool, deleteLocalData bool) error { diff --git a/src/client/errors.go b/src/client/errors.go index 5344334..14237ed 100644 --- a/src/client/errors.go +++ b/src/client/errors.go @@ -23,3 +23,11 @@ type InternalError struct { func (e *InternalError) Error() string { return e.Description } + +type InvalidTransportError struct { + Description string +} + +func (e *InvalidTransportError) Error() string { + return e.Description +}