Skip to main content

lockbook_server_lib/
lib.rs

1use 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;