2023-12-17 15:54:35 +02:00
|
|
|
// mautrix-signal - A Matrix-signal puppeting bridge.
|
|
|
|
|
// Copyright (C) 2023 Sumner Evans
|
|
|
|
|
//
|
|
|
|
|
// This program is free software: you can redistribute it and/or modify
|
|
|
|
|
// it under the terms of the GNU Affero General Public License as published by
|
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or
|
|
|
|
|
// (at your option) any later version.
|
|
|
|
|
//
|
|
|
|
|
// This program is distributed in the hope that it will be useful,
|
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
|
// GNU Affero General Public License for more details.
|
|
|
|
|
//
|
|
|
|
|
// You should have received a copy of the GNU Affero General Public License
|
|
|
|
|
// along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
|
|
2023-03-22 10:31:22 -06:00
|
|
|
package libsignalgo
|
|
|
|
|
|
|
|
|
|
/*
|
2023-03-22 10:55:34 -06:00
|
|
|
#include "./libsignal-ffi.h"
|
2023-03-22 10:31:22 -06:00
|
|
|
*/
|
|
|
|
|
import "C"
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type ErrorCode int
|
|
|
|
|
|
2026-01-29 18:45:34 +02:00
|
|
|
func (e ErrorCode) Error() string {
|
|
|
|
|
return fmt.Sprintf("libsignalgo.ErrorCode(%d)", int(e))
|
|
|
|
|
}
|
|
|
|
|
|
2023-03-22 10:31:22 -06:00
|
|
|
const (
|
2026-01-16 15:01:48 +02:00
|
|
|
ErrorCodeUnknownError ErrorCode = 1
|
|
|
|
|
ErrorCodeInvalidState ErrorCode = 2
|
|
|
|
|
ErrorCodeInternalError ErrorCode = 3
|
|
|
|
|
ErrorCodeNullParameter ErrorCode = 4
|
|
|
|
|
ErrorCodeInvalidArgument ErrorCode = 5
|
|
|
|
|
ErrorCodeInvalidType ErrorCode = 6
|
|
|
|
|
ErrorCodeInvalidUtf8String ErrorCode = 7
|
|
|
|
|
ErrorCodeCancelled ErrorCode = 8
|
|
|
|
|
ErrorCodeProtobufError ErrorCode = 10
|
|
|
|
|
ErrorCodeLegacyCiphertextVersion ErrorCode = 21
|
|
|
|
|
ErrorCodeUnknownCiphertextVersion ErrorCode = 22
|
|
|
|
|
ErrorCodeUnrecognizedMessageVersion ErrorCode = 23
|
|
|
|
|
ErrorCodeInvalidMessage ErrorCode = 30
|
|
|
|
|
ErrorCodeSealedSenderSelfSend ErrorCode = 31
|
|
|
|
|
ErrorCodeInvalidKey ErrorCode = 40
|
|
|
|
|
ErrorCodeInvalidSignature ErrorCode = 41
|
|
|
|
|
ErrorCodeInvalidAttestationData ErrorCode = 42
|
|
|
|
|
ErrorCodeFingerprintVersionMismatch ErrorCode = 51
|
|
|
|
|
ErrorCodeFingerprintParsingError ErrorCode = 52
|
|
|
|
|
ErrorCodeUntrustedIdentity ErrorCode = 60
|
|
|
|
|
ErrorCodeInvalidKeyIdentifier ErrorCode = 70
|
|
|
|
|
ErrorCodeSessionNotFound ErrorCode = 80
|
|
|
|
|
ErrorCodeInvalidRegistrationId ErrorCode = 81
|
|
|
|
|
ErrorCodeInvalidSession ErrorCode = 82
|
|
|
|
|
ErrorCodeInvalidSenderKeySession ErrorCode = 83
|
|
|
|
|
ErrorCodeInvalidProtocolAddress ErrorCode = 84
|
|
|
|
|
ErrorCodeDuplicatedMessage ErrorCode = 90
|
|
|
|
|
ErrorCodeCallbackError ErrorCode = 100
|
|
|
|
|
ErrorCodeVerificationFailure ErrorCode = 110
|
|
|
|
|
ErrorCodeUsernameCannotBeEmpty ErrorCode = 120
|
|
|
|
|
ErrorCodeUsernameCannotStartWithDigit ErrorCode = 121
|
|
|
|
|
ErrorCodeUsernameMissingSeparator ErrorCode = 122
|
|
|
|
|
ErrorCodeUsernameBadDiscriminatorCharacter ErrorCode = 123
|
|
|
|
|
ErrorCodeUsernameBadNicknameCharacter ErrorCode = 124
|
|
|
|
|
ErrorCodeUsernameTooShort ErrorCode = 125
|
|
|
|
|
ErrorCodeUsernameTooLong ErrorCode = 126
|
|
|
|
|
ErrorCodeUsernameLinkInvalidEntropyDataLength ErrorCode = 127
|
|
|
|
|
ErrorCodeUsernameLinkInvalid ErrorCode = 128
|
|
|
|
|
ErrorCodeUsernameDiscriminatorCannotBeEmpty ErrorCode = 130
|
|
|
|
|
ErrorCodeUsernameDiscriminatorCannotBeZero ErrorCode = 131
|
|
|
|
|
ErrorCodeUsernameDiscriminatorCannotBeSingleDigit ErrorCode = 132
|
|
|
|
|
ErrorCodeUsernameDiscriminatorCannotHaveLeadingZeros ErrorCode = 133
|
|
|
|
|
ErrorCodeUsernameDiscriminatorTooLarge ErrorCode = 134
|
|
|
|
|
ErrorCodeIoError ErrorCode = 140
|
|
|
|
|
ErrorCodeInvalidMediaInput ErrorCode = 141
|
|
|
|
|
ErrorCodeUnsupportedMediaInput ErrorCode = 142
|
|
|
|
|
ErrorCodeConnectionTimedOut ErrorCode = 143
|
|
|
|
|
ErrorCodeNetworkProtocol ErrorCode = 144
|
|
|
|
|
ErrorCodeRateLimited ErrorCode = 145
|
|
|
|
|
ErrorCodeWebSocket ErrorCode = 146
|
|
|
|
|
ErrorCodeCdsiInvalidToken ErrorCode = 147
|
|
|
|
|
ErrorCodeConnectionFailed ErrorCode = 148
|
|
|
|
|
ErrorCodeChatServiceInactive ErrorCode = 149
|
|
|
|
|
ErrorCodeRequestTimedOut ErrorCode = 150
|
|
|
|
|
ErrorCodeRateLimitChallenge ErrorCode = 151
|
|
|
|
|
ErrorCodePossibleCaptiveNetwork ErrorCode = 152
|
|
|
|
|
ErrorCodeSvrDataMissing ErrorCode = 160
|
|
|
|
|
ErrorCodeSvrRestoreFailed ErrorCode = 161
|
|
|
|
|
ErrorCodeSvrRotationMachineTooManySteps ErrorCode = 162
|
|
|
|
|
ErrorCodeSvrRequestFailed ErrorCode = 163
|
|
|
|
|
ErrorCodeAppExpired ErrorCode = 170
|
|
|
|
|
ErrorCodeDeviceDeregistered ErrorCode = 171
|
|
|
|
|
ErrorCodeConnectionInvalidated ErrorCode = 172
|
|
|
|
|
ErrorCodeConnectedElsewhere ErrorCode = 173
|
|
|
|
|
ErrorCodeBackupValidation ErrorCode = 180
|
|
|
|
|
ErrorCodeRegistrationInvalidSessionId ErrorCode = 190
|
|
|
|
|
ErrorCodeRegistrationUnknown ErrorCode = 192
|
|
|
|
|
ErrorCodeRegistrationSessionNotFound ErrorCode = 193
|
|
|
|
|
ErrorCodeRegistrationNotReadyForVerification ErrorCode = 194
|
|
|
|
|
ErrorCodeRegistrationSendVerificationCodeFailed ErrorCode = 195
|
|
|
|
|
ErrorCodeRegistrationCodeNotDeliverable ErrorCode = 196
|
|
|
|
|
ErrorCodeRegistrationSessionUpdateRejected ErrorCode = 197
|
|
|
|
|
ErrorCodeRegistrationCredentialsCouldNotBeParsed ErrorCode = 198
|
|
|
|
|
ErrorCodeRegistrationDeviceTransferPossible ErrorCode = 199
|
|
|
|
|
ErrorCodeRegistrationRecoveryVerificationFailed ErrorCode = 200
|
|
|
|
|
ErrorCodeRegistrationLock ErrorCode = 201
|
|
|
|
|
ErrorCodeKeyTransparencyError ErrorCode = 210
|
|
|
|
|
ErrorCodeKeyTransparencyVerificationFailed ErrorCode = 211
|
|
|
|
|
ErrorCodeRequestUnauthorized ErrorCode = 220
|
|
|
|
|
ErrorCodeMismatchedDevices ErrorCode = 221
|
2023-03-22 10:31:22 -06:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type SignalError struct {
|
|
|
|
|
Code ErrorCode
|
|
|
|
|
Message string
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (e *SignalError) Error() string {
|
|
|
|
|
return fmt.Sprintf("%d: %s", e.Code, e.Message)
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-29 18:45:34 +02:00
|
|
|
func (e *SignalError) Unwrap() error {
|
|
|
|
|
return e.Code
|
|
|
|
|
}
|
|
|
|
|
|
2024-01-04 01:06:45 +02:00
|
|
|
func (ctx *CallbackContext) wrapError(signalError *C.SignalFfiError) error {
|
2023-03-22 10:31:22 -06:00
|
|
|
if signalError == nil {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
defer C.signal_error_free(signalError)
|
|
|
|
|
|
|
|
|
|
errorType := C.signal_error_get_type(signalError)
|
|
|
|
|
if ErrorCode(errorType) == ErrorCodeCallbackError {
|
|
|
|
|
return ctx.Error
|
|
|
|
|
} else {
|
|
|
|
|
return wrapSignalError(signalError, errorType)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func wrapError(signalError *C.SignalFfiError) error {
|
|
|
|
|
if signalError == nil {
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
defer C.signal_error_free(signalError)
|
|
|
|
|
|
|
|
|
|
return wrapSignalError(signalError, C.signal_error_get_type(signalError))
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func wrapSignalError(signalError *C.SignalFfiError, errorType C.uint32_t) error {
|
|
|
|
|
var messageBytes *C.char
|
2025-07-23 11:17:36 +03:00
|
|
|
getMessageError := C.signal_error_get_message(&messageBytes, signalError)
|
2023-03-22 10:31:22 -06:00
|
|
|
if getMessageError != nil {
|
2024-01-04 01:06:45 +02:00
|
|
|
// Ignore any errors from this, it will just end up being an empty string.
|
2023-03-22 10:31:22 -06:00
|
|
|
C.signal_error_free(getMessageError)
|
|
|
|
|
}
|
|
|
|
|
return &SignalError{Code: ErrorCode(errorType), Message: CopyCStringToString(messageBytes)}
|
|
|
|
|
}
|