lockbook_server_lib/
error_handler.rs1use crate::account_service::DeleteAccountHelperError;
2use crate::billing::billing_service::{AppStoreNotificationError, LockBillingWorkflowError};
3use crate::billing::google_play_client::SimpleGCPError;
4use crate::metrics::MetricsError;
5use crate::ServerError::InternalError;
6use crate::{
7 ClientError, GetUsageHelperError, ServerError, SimplifiedStripeError, StripeWebhookError,
8};
9use base64::DecodeError;
10use db_rs::DbError;
11use jsonwebtoken::errors::ErrorKind;
12use lockbook_shared::api::*;
13use lockbook_shared::{SharedError, SharedErrorKind};
14use std::fmt::Debug;
15use std::io::Error;
16use std::sync::PoisonError;
17
18impl<T: Debug> From<Error> for ServerError<T> {
19 fn from(err: Error) -> Self {
20 internal!("IO Error: {:?}", err)
21 }
22}
23
24impl<T: Debug> From<Box<bincode::ErrorKind>> for ServerError<T> {
25 fn from(err: Box<bincode::ErrorKind>) -> Self {
26 internal!("Bincode error: {:?}", err)
27 }
28}
29
30impl<T: Debug> From<stripe::ParseIdError> for ServerError<T> {
31 fn from(err: stripe::ParseIdError) -> Self {
32 internal!("Stripe parse error: {:?}", err)
33 }
34}
35
36impl<T: Debug> From<serde_json::Error> for ServerError<T> {
37 fn from(err: serde_json::Error) -> Self {
38 internal!("Serde json Error: {:?}", err)
39 }
40}
41
42impl From<SharedError> for ServerError<CancelSubscriptionError> {
43 fn from(err: SharedError) -> Self {
44 internal!("{:?}", err)
45 }
46}
47impl From<SharedError> for ServerError<AdminGetAccountInfoError> {
48 fn from(err: SharedError) -> Self {
49 internal!("{:?}", err)
50 }
51}
52impl From<SharedError> for ServerError<GetUsageError> {
53 fn from(err: SharedError) -> Self {
54 internal!("{:?}", err)
55 }
56}
57
58impl From<ServerError<GetUsageHelperError>> for ServerError<GetUsageError> {
59 fn from(e: ServerError<GetUsageHelperError>) -> Self {
60 match e {
61 ServerError::ClientError(GetUsageHelperError::UserNotFound) => {
62 ClientError(GetUsageError::UserNotFound)
63 }
64 _ => internal!("{:?}", e),
65 }
66 }
67}
68
69impl From<ServerError<GetUsageHelperError>> for ServerError<CancelSubscriptionError> {
70 fn from(e: ServerError<GetUsageHelperError>) -> Self {
71 match e {
72 ServerError::ClientError(GetUsageHelperError::UserNotFound) => {
73 ClientError(CancelSubscriptionError::UserNotFound)
74 }
75 _ => internal!("{:?}", e),
76 }
77 }
78}
79
80impl From<SimpleGCPError> for ServerError<UpgradeAccountGooglePlayError> {
81 fn from(e: SimpleGCPError) -> Self {
82 match e {
83 SimpleGCPError::PurchaseTokenNotFound => {
84 ClientError(UpgradeAccountGooglePlayError::InvalidPurchaseToken)
85 }
86 SimpleGCPError::Unexpected(msg) => internal!("{}", msg),
87 }
88 }
89}
90
91impl From<SimpleGCPError> for ServerError<CancelSubscriptionError> {
92 fn from(e: SimpleGCPError) -> Self {
93 internal!("{:#?}", e)
94 }
95}
96
97impl From<SimplifiedStripeError> for ServerError<UpgradeAccountStripeError> {
98 fn from(e: SimplifiedStripeError) -> Self {
99 match e {
100 SimplifiedStripeError::CardDecline => {
101 ClientError(UpgradeAccountStripeError::CardDecline)
102 }
103 SimplifiedStripeError::InsufficientFunds => {
104 ClientError(UpgradeAccountStripeError::InsufficientFunds)
105 }
106 SimplifiedStripeError::TryAgain => ClientError(UpgradeAccountStripeError::TryAgain),
107 SimplifiedStripeError::CardNotSupported => {
108 ClientError(UpgradeAccountStripeError::CardNotSupported)
109 }
110 SimplifiedStripeError::ExpiredCard => {
111 ClientError(UpgradeAccountStripeError::ExpiredCard)
112 }
113 SimplifiedStripeError::InvalidCardNumber => {
114 ClientError(UpgradeAccountStripeError::InvalidCardNumber)
115 }
116 SimplifiedStripeError::InvalidCardExpYear => {
117 ClientError(UpgradeAccountStripeError::InvalidCardExpYear)
118 }
119 SimplifiedStripeError::InvalidCardExpMonth => {
120 ClientError(UpgradeAccountStripeError::InvalidCardExpMonth)
121 }
122 SimplifiedStripeError::InvalidCardCvc => {
123 ClientError(UpgradeAccountStripeError::InvalidCardCvc)
124 }
125 SimplifiedStripeError::Other(msg) => internal!("{}", msg),
126 }
127 }
128}
129
130impl From<stripe::WebhookError> for ServerError<StripeWebhookError> {
131 fn from(e: stripe::WebhookError) -> Self {
132 match e {
133 stripe::WebhookError::BadKey => {
134 internal!("Cannot verify stripe webhook request because server is using a bad signing key")
135 }
136 stripe::WebhookError::BadHeader(bad_header_err) => {
137 ClientError(StripeWebhookError::InvalidHeader(format!("{:?}", bad_header_err)))
138 }
139 stripe::WebhookError::BadSignature => {
140 ClientError(StripeWebhookError::InvalidHeader("Bad signature".to_string()))
141 }
142 stripe::WebhookError::BadTimestamp(bad_timestamp_err) => {
143 ClientError(StripeWebhookError::InvalidHeader(format!(
144 "Timestamp for webhook is too old: {}",
145 bad_timestamp_err
146 )))
147 }
148 stripe::WebhookError::BadParse(bad_parse_err) => ClientError(
149 StripeWebhookError::ParseError(format!("Parsing error: {:?}", bad_parse_err)),
150 ),
151 }
152 }
153}
154
155impl From<jsonwebtoken::errors::Error> for ServerError<UpgradeAccountAppStoreError> {
156 fn from(err: jsonwebtoken::errors::Error) -> Self {
157 internal!("JWT error: {:?}", err)
158 }
159}
160
161impl From<reqwest::Error> for ServerError<UpgradeAccountAppStoreError> {
162 fn from(err: reqwest::Error) -> Self {
163 internal!("reqwest error: {:?}", err)
164 }
165}
166
167impl From<base64::DecodeError> for ServerError<AppStoreNotificationError> {
168 fn from(_: DecodeError) -> Self {
169 ClientError(AppStoreNotificationError::InvalidJWS)
170 }
171}
172
173impl From<jsonwebtoken::errors::Error> for ServerError<AppStoreNotificationError> {
174 fn from(err: jsonwebtoken::errors::Error) -> Self {
175 match err.kind() {
176 ErrorKind::InvalidToken
177 | ErrorKind::InvalidSignature
178 | ErrorKind::MissingRequiredClaim(_)
179 | ErrorKind::ExpiredSignature
180 | ErrorKind::InvalidIssuer
181 | ErrorKind::InvalidAudience
182 | ErrorKind::InvalidSubject
183 | ErrorKind::ImmatureSignature
184 | ErrorKind::InvalidAlgorithm
185 | ErrorKind::MissingAlgorithm
186 | ErrorKind::Base64(_)
187 | ErrorKind::Json(_)
188 | ErrorKind::Utf8(_) => ClientError(AppStoreNotificationError::InvalidJWS),
189 ErrorKind::InvalidEcdsaKey
190 | ErrorKind::InvalidRsaKey(_)
191 | ErrorKind::RsaFailedSigning
192 | ErrorKind::InvalidAlgorithmName
193 | ErrorKind::InvalidKeyFormat
194 | ErrorKind::Crypto(_)
195 | &_ => internal!("JWT error: {:?}", err),
196 }
197 }
198}
199
200impl From<ServerError<LockBillingWorkflowError>> for ServerError<UpgradeAccountGooglePlayError> {
201 fn from(err: ServerError<LockBillingWorkflowError>) -> Self {
202 match err {
203 ClientError(LockBillingWorkflowError::ExistingRequestPending) => {
204 ClientError(UpgradeAccountGooglePlayError::ExistingRequestPending)
205 }
206 ClientError(LockBillingWorkflowError::UserNotFound) => {
207 ClientError(UpgradeAccountGooglePlayError::UserNotFound)
208 }
209 InternalError(msg) => InternalError(msg),
210 }
211 }
212}
213
214impl From<ServerError<LockBillingWorkflowError>> for ServerError<UpgradeAccountAppStoreError> {
215 fn from(err: ServerError<LockBillingWorkflowError>) -> Self {
216 match err {
217 ClientError(LockBillingWorkflowError::ExistingRequestPending) => {
218 ClientError(UpgradeAccountAppStoreError::ExistingRequestPending)
219 }
220 ClientError(LockBillingWorkflowError::UserNotFound) => {
221 ClientError(UpgradeAccountAppStoreError::UserNotFound)
222 }
223 InternalError(msg) => InternalError(msg),
224 }
225 }
226}
227
228impl From<ServerError<LockBillingWorkflowError>> for ServerError<UpgradeAccountStripeError> {
229 fn from(err: ServerError<LockBillingWorkflowError>) -> Self {
230 match err {
231 ClientError(LockBillingWorkflowError::ExistingRequestPending) => {
232 ClientError(UpgradeAccountStripeError::ExistingRequestPending)
233 }
234 ClientError(LockBillingWorkflowError::UserNotFound) => {
235 ClientError(UpgradeAccountStripeError::UserNotFound)
236 }
237 InternalError(msg) => InternalError(msg),
238 }
239 }
240}
241
242impl From<ServerError<LockBillingWorkflowError>> for ServerError<CancelSubscriptionError> {
243 fn from(err: ServerError<LockBillingWorkflowError>) -> Self {
244 match err {
245 ClientError(LockBillingWorkflowError::ExistingRequestPending) => {
246 ClientError(CancelSubscriptionError::ExistingRequestPending)
247 }
248 ClientError(LockBillingWorkflowError::UserNotFound) => {
249 ClientError(CancelSubscriptionError::UserNotFound)
250 }
251 InternalError(msg) => InternalError(msg),
252 }
253 }
254}
255
256impl From<ServerError<LockBillingWorkflowError>> for ServerError<AdminSetUserTierError> {
257 fn from(err: ServerError<LockBillingWorkflowError>) -> Self {
258 match err {
259 ClientError(LockBillingWorkflowError::ExistingRequestPending) => {
260 ClientError(AdminSetUserTierError::ExistingRequestPending)
261 }
262 ClientError(LockBillingWorkflowError::UserNotFound) => {
263 ClientError(AdminSetUserTierError::UserNotFound)
264 }
265 InternalError(msg) => InternalError(msg),
266 }
267 }
268}
269
270impl From<SharedError> for ServerError<DeleteAccountHelperError> {
271 fn from(err: SharedError) -> Self {
272 internal!("{:?}", err)
273 }
274}
275
276impl From<ServerError<DeleteAccountHelperError>> for ServerError<DeleteAccountError> {
277 fn from(err: ServerError<DeleteAccountHelperError>) -> Self {
278 match err {
279 ClientError(DeleteAccountHelperError::UserNotFound) => {
280 ClientError(DeleteAccountError::UserNotFound)
281 }
282 InternalError(msg) => InternalError(msg),
283 }
284 }
285}
286
287impl From<ServerError<DeleteAccountHelperError>> for ServerError<AdminDisappearAccountError> {
288 fn from(err: ServerError<DeleteAccountHelperError>) -> Self {
289 match err {
290 ClientError(DeleteAccountHelperError::UserNotFound) => {
291 ClientError(AdminDisappearAccountError::UserNotFound)
292 }
293 InternalError(msg) => InternalError(msg),
294 }
295 }
296}
297
298impl From<SharedError> for ServerError<AdminValidateAccountError> {
299 fn from(err: SharedError) -> Self {
300 internal!("{:?}", err)
301 }
302}
303
304impl From<SharedError> for ServerError<AdminValidateServerError> {
305 fn from(err: SharedError) -> Self {
306 internal!("{:?}", err)
307 }
308}
309
310impl From<SharedError> for ServerError<AdminFileInfoError> {
311 fn from(err: SharedError) -> Self {
312 internal!("{:?}", err)
313 }
314}
315
316impl From<SharedError> for ServerError<AdminDisappearFileError> {
317 fn from(err: SharedError) -> Self {
318 internal!("{:?}", err)
319 }
320}
321
322impl From<SharedError> for ServerError<UpsertError> {
323 fn from(err: SharedError) -> Self {
324 use lockbook_shared::api::UpsertError::*;
326 match err.kind {
327 SharedErrorKind::OldVersionIncorrect => ClientError(OldVersionIncorrect),
328 SharedErrorKind::OldFileNotFound => ClientError(OldFileNotFound),
329 SharedErrorKind::OldVersionRequired => ClientError(OldVersionRequired),
330 SharedErrorKind::InsufficientPermission => ClientError(NotPermissioned),
331 SharedErrorKind::DiffMalformed => ClientError(DiffMalformed),
332 SharedErrorKind::HmacModificationInvalid => ClientError(HmacModificationInvalid),
333 SharedErrorKind::DeletedFileUpdated(_) => ClientError(DeletedFileUpdated),
334 SharedErrorKind::RootModificationInvalid => ClientError(RootModificationInvalid),
335 SharedErrorKind::ValidationFailure(fail) => ClientError(Validation(fail)),
336 SharedErrorKind::Unexpected(msg) => InternalError(String::from(msg)),
337 _ => internal!("{:?}", err),
338 }
339 }
340}
341
342impl From<SharedError> for ServerError<ChangeDocError> {
343 fn from(err: SharedError) -> Self {
344 internal!("{:?}", err)
345 }
346}
347
348impl From<SharedError> for ServerError<MetricsError> {
349 fn from(err: SharedError) -> Self {
350 internal!("{:?}", err)
351 }
352}
353
354impl From<SharedError> for ServerError<GetDocumentError> {
355 fn from(err: SharedError) -> Self {
356 internal!("{:?}", err)
357 }
358}
359
360impl From<SharedError> for ServerError<GetFileIdsError> {
361 fn from(err: SharedError) -> Self {
362 internal!("{:?}", err)
363 }
364}
365
366impl From<SharedError> for ServerError<GetUpdatesError> {
367 fn from(err: SharedError) -> Self {
368 internal!("{:?}", err)
369 }
370}
371
372impl<T: Debug> From<DbError> for ServerError<T> {
373 fn from(value: DbError) -> Self {
374 internal!("db-rs error {:?}", value)
375 }
376}
377
378impl<T: Debug, G> From<PoisonError<G>> for ServerError<T> {
379 fn from(value: PoisonError<G>) -> Self {
380 internal!("mutex poisoned {:?}", value)
381 }
382}