lockbook_server_lib/
lib.rs1use billing::app_store_client::AppStoreClient;
2use billing::google_play_client::GooglePlayClient;
3use billing::stripe_client::StripeClient;
4use defense::IpData;
5use document_service::DocumentService;
6use lb_rs::model::clock;
7use lb_rs::model::errors::LbResult;
8use schema::ServerDb;
9use std::collections::VecDeque;
10use std::env;
11use std::fmt::Debug;
12use std::net::SocketAddr;
13use std::sync::Arc;
14use tokio::sync::Mutex;
15
16use lb_rs::model::api::{ErrorWrapper, Request, RequestWrapper};
17use lb_rs::model::pubkey;
18use libsecp256k1::PublicKey;
19use semver::Version;
20use serde::{Deserialize, Serialize};
21
22use crate::ServerError::ClientError;
23use crate::account_service::GetUsageHelperError;
24use crate::billing::billing_service::StripeWebhookError;
25use crate::billing::stripe_error::SimplifiedStripeError;
26pub use stripe;
27use tracing::log::warn;
28
29static CARGO_PKG_VERSION: &str = env!("CARGO_PKG_VERSION");
30
31#[derive(Clone)]
32pub struct ServerState<S, A, G, D>
33where
34 S: StripeClient,
35 A: AppStoreClient,
36 G: GooglePlayClient,
37 D: DocumentService,
38{
39 pub config: config::Config,
40 pub index_db: Arc<Mutex<ServerDb>>,
41 pub stripe_client: S,
42 pub google_play_client: G,
43 pub app_store_client: A,
44 pub document_service: D,
45 pub discord_client: reqwest::Client,
46 pub recent_new_account_ips: Arc<Mutex<VecDeque<IpData>>>,
47}
48
49#[derive(Clone)]
50pub struct RequestContext<TRequest> {
51 pub request: TRequest,
52 pub public_key: PublicKey,
53 pub ip: Option<SocketAddr>,
54}
55
56#[derive(Clone, Debug, Serialize, Deserialize)]
57pub enum ServerError<U: Debug> {
58 ClientError(U),
59 InternalError(String),
60}
61
62#[macro_export]
63macro_rules! internal {
64 ($($arg:tt)*) => {{
65 let msg = format!($($arg)*);
66 tracing::error!("{}", msg);
67 $crate::ServerError::InternalError(msg)
68 }};
69}
70
71pub fn handle_version_header<Req: Request>(
72 config: &config::Config, version: &Option<String>,
73) -> Result<(), ErrorWrapper<Req::Error>> {
74 let v = &version.clone().unwrap_or("0.0.0".to_string());
75 let Ok(v) = Version::parse(v) else {
76 warn!("version not parsable, request rejected: {v}");
77 return Err(ErrorWrapper::BadRequest);
78 };
79 router_service::CORE_VERSION_COUNTER
80 .with_label_values(&[&(v.to_string())])
81 .inc();
82 if !config.server.min_core_version.matches(&v) {
83 return Err(ErrorWrapper::<Req::Error>::ClientUpdateRequired);
84 }
85 Ok(())
86}
87
88pub fn verify_auth<TRequest>(
89 config: &config::Config, request: &RequestWrapper<TRequest>,
90) -> LbResult<()>
91where
92 TRequest: Request + Serialize,
93{
94 pubkey::verify(
95 &request.signed_request.public_key,
96 &request.signed_request,
97 config.server.max_auth_delay as u64,
98 config.server.max_auth_delay as u64,
99 clock::get_time,
100 )
101}
102
103pub mod account_service;
104pub mod billing;
105pub mod config;
106pub mod debug_info;
107pub mod defense;
108pub mod document_service;
109pub mod error_handler;
110pub mod file_service;
111pub mod garbage_worker;
112pub mod loggers;
113pub mod metrics;
114pub mod router_service;
115pub mod schema;
116pub mod utils;