libsignal_service/push_service/
error.rs

1use aes::cipher::block_padding::UnpadError;
2use libsignal_core::curve::CurveError;
3use libsignal_protocol::{
4    FingerprintError, ServiceIdKind, SignalProtocolError,
5};
6use zkgroup::{ZkGroupDeserializationFailure, ZkGroupVerificationFailure};
7
8use crate::groups_v2::GroupDecodingError;
9
10use super::{
11    MismatchedDevices, ProofRequired, RegistrationLockFailure, StaleDevices,
12};
13
14#[derive(thiserror::Error, Debug)]
15pub enum ServiceError {
16    #[error("Service request timed out: {reason}")]
17    Timeout { reason: &'static str },
18
19    #[error("invalid URL: {0}")]
20    InvalidUrl(#[from] url::ParseError),
21
22    #[error("wrong address type: {0}")]
23    InvalidAddressType(ServiceIdKind),
24
25    #[error("Error sending request: {reason}")]
26    SendError { reason: String },
27
28    #[error("i/o error")]
29    IO(#[from] std::io::Error),
30
31    #[error("Error decoding JSON: {0}")]
32    JsonDecodeError(#[from] serde_json::Error),
33    #[error("Error decoding protobuf frame: {0}")]
34    ProtobufDecodeError(#[from] prost::DecodeError),
35    #[error("error encoding or decoding bincode: {0}")]
36    BincodeError(#[from] bincode::Error),
37    #[error("error decoding base64 string: {0}")]
38    Base64DecodeError(#[from] base64::DecodeError),
39
40    #[error("Rate limit exceeded")]
41    RateLimitExceeded,
42    #[error("Authorization failed")]
43    Unauthorized,
44    #[error("Registration lock is set: {0:?}")]
45    Locked(RegistrationLockFailure),
46    #[error("Unexpected response: HTTP {http_code}")]
47    UnhandledResponseCode { http_code: u16 },
48
49    #[error("Websocket error: {0}")]
50    WsError(#[from] reqwest_websocket::Error),
51    #[error("Websocket closing: {reason}")]
52    WsClosing { reason: &'static str },
53
54    #[error("Invalid padding: {0}")]
55    Padding(#[from] UnpadError),
56
57    #[error("unknown padding version {0}")]
58    PaddingVersion(u32),
59
60    #[error("Invalid frame: {reason}")]
61    InvalidFrame { reason: &'static str },
62
63    #[error("MAC error")]
64    MacError,
65
66    #[error("Protocol error: {0}")]
67    SignalProtocolError(#[from] SignalProtocolError),
68
69    #[error("invalid device id: {0}")]
70    InvalidDeviceId(#[from] libsignal_core::InvalidDeviceId),
71
72    #[error("Proof required: {0:?}")]
73    ProofRequiredError(ProofRequired),
74
75    #[error("{0:?}")]
76    MismatchedDevicesException(MismatchedDevices),
77
78    #[error("{0:?}")]
79    StaleDevices(StaleDevices),
80
81    #[error(transparent)]
82    CredentialsCacheError(#[from] crate::groups_v2::CredentialsCacheError),
83
84    #[error("groups v2 (zero-knowledge) error")]
85    GroupsV2Error,
86
87    #[error(transparent)]
88    GroupsV2DecryptionError(#[from] GroupDecodingError),
89
90    #[error(transparent)]
91    ZkGroupDeserializationFailure(#[from] ZkGroupDeserializationFailure),
92
93    #[error(transparent)]
94    ZkGroupVerificationFailure(#[from] ZkGroupVerificationFailure),
95
96    #[error("unsupported content")]
97    UnsupportedContent,
98
99    #[error("Not found.")]
100    NotFoundError,
101
102    #[error("invalid device name")]
103    InvalidDeviceName,
104
105    #[error("Unknown CDN version {0}")]
106    UnknownCdnVersion(u32),
107
108    #[error("HTTP reqwest error: {0}")]
109    Http(#[from] reqwest::Error),
110
111    #[error(transparent)]
112    Curve(#[from] CurveError),
113
114    // FingerprintError does not implement StdError, so we need a manual display,
115    // and manual From impl.
116    #[error("Fingerprint error: {0}")]
117    Fingerprint(FingerprintError),
118}
119
120impl From<FingerprintError> for ServiceError {
121    fn from(value: FingerprintError) -> Self {
122        ServiceError::Fingerprint(value)
123    }
124}