libsignal_service/push_service/
error.rs1use 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 #[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}