2024-04-04 11:40:26 +10:00
|
|
|
// SPDX-FileCopyrightText: 2023 Sayantan Santra <sayantan.santra689@gmail.com>
|
|
|
|
// SPDX-License-Identifier: MIT
|
|
|
|
|
2024-05-31 05:45:18 +10:00
|
|
|
use actix_files::Files;
|
|
|
|
use actix_session::{storage::CookieSessionStore, SessionMiddleware};
|
|
|
|
use actix_web::{cookie::Key, middleware, web, App, HttpServer};
|
2023-04-04 09:52:17 +10:00
|
|
|
use rusqlite::Connection;
|
2024-04-04 08:40:59 +10:00
|
|
|
use std::{env, io::Result};
|
2024-05-31 05:45:18 +10:00
|
|
|
|
|
|
|
// Import modules
|
2023-04-08 17:52:16 +10:00
|
|
|
mod auth;
|
2023-04-03 13:26:23 +10:00
|
|
|
mod database;
|
2024-05-31 05:45:18 +10:00
|
|
|
mod services;
|
2023-04-03 13:26:23 +10:00
|
|
|
mod utils;
|
2023-04-03 07:53:55 +10:00
|
|
|
|
2023-04-04 09:52:17 +10:00
|
|
|
// This struct represents state
|
|
|
|
struct AppState {
|
|
|
|
db: Connection,
|
|
|
|
}
|
|
|
|
|
2023-04-03 13:26:23 +10:00
|
|
|
#[actix_web::main]
|
2024-04-04 08:40:59 +10:00
|
|
|
async fn main() -> Result<()> {
|
2023-04-11 02:51:20 +10:00
|
|
|
env_logger::init_from_env(env_logger::Env::new().default_filter_or("warn"));
|
|
|
|
|
|
|
|
// Generate session key in runtime so that restart invalidates older logins
|
2023-04-08 17:52:16 +10:00
|
|
|
let secret_key = Key::generate();
|
2024-05-30 01:34:45 +10:00
|
|
|
let db_location = env::var("db_url")
|
|
|
|
.ok()
|
|
|
|
.filter(|s| !s.trim().is_empty())
|
2024-10-03 14:46:35 +10:00
|
|
|
.unwrap_or(String::from("urls.sqlite"));
|
2024-05-30 01:34:45 +10:00
|
|
|
|
2023-04-09 06:56:29 +10:00
|
|
|
let port = env::var("port")
|
2023-05-24 08:58:57 +10:00
|
|
|
.unwrap_or(String::from("4567"))
|
2023-04-09 06:56:29 +10:00
|
|
|
.parse::<u16>()
|
|
|
|
.expect("Supplied port is not an integer");
|
2023-04-09 06:36:33 +10:00
|
|
|
|
2024-05-31 16:41:55 +10:00
|
|
|
let cache_control_header = env::var("cache_control_header")
|
|
|
|
.ok()
|
2024-06-01 11:30:09 +10:00
|
|
|
.filter(|s| !s.trim().is_empty());
|
2024-05-31 16:41:55 +10:00
|
|
|
|
2023-04-09 06:36:33 +10:00
|
|
|
// Actually start the server
|
2023-04-08 17:52:16 +10:00
|
|
|
HttpServer::new(move || {
|
2023-04-03 07:53:55 +10:00
|
|
|
App::new()
|
2024-04-12 04:01:33 +10:00
|
|
|
.wrap(middleware::Logger::default())
|
|
|
|
.wrap(middleware::Compress::default())
|
2023-10-09 09:20:34 +10:00
|
|
|
.wrap(
|
|
|
|
SessionMiddleware::builder(CookieSessionStore::default(), secret_key.clone())
|
2024-04-03 09:07:29 +10:00
|
|
|
.cookie_same_site(actix_web::cookie::SameSite::Strict)
|
2023-10-09 09:20:34 +10:00
|
|
|
.cookie_secure(false)
|
|
|
|
.build(),
|
|
|
|
)
|
2023-04-09 06:36:33 +10:00
|
|
|
// Maintain a single instance of database throughout
|
2023-04-04 09:52:17 +10:00
|
|
|
.app_data(web::Data::new(AppState {
|
2024-05-30 01:34:45 +10:00
|
|
|
db: database::open_db(db_location.clone()),
|
2023-04-04 09:52:17 +10:00
|
|
|
}))
|
2024-06-01 11:30:09 +10:00
|
|
|
.wrap(if let Some(header) = &cache_control_header {
|
|
|
|
middleware::DefaultHeaders::new().add(("Cache-Control", header.to_owned()))
|
2024-05-31 16:41:55 +10:00
|
|
|
} else {
|
2024-06-01 11:30:09 +10:00
|
|
|
middleware::DefaultHeaders::new()
|
2024-05-31 16:41:55 +10:00
|
|
|
})
|
2024-05-31 05:45:18 +10:00
|
|
|
.service(services::link_handler)
|
|
|
|
.service(services::getall)
|
|
|
|
.service(services::siteurl)
|
|
|
|
.service(services::version)
|
|
|
|
.service(services::add_link)
|
|
|
|
.service(services::delete_link)
|
|
|
|
.service(services::login)
|
|
|
|
.service(services::logout)
|
2023-05-06 15:34:56 +10:00
|
|
|
.service(Files::new("/", "./resources/").index_file("index.html"))
|
2024-05-31 05:45:18 +10:00
|
|
|
.default_service(actix_web::web::get().to(services::error404))
|
2023-04-03 07:53:55 +10:00
|
|
|
})
|
2023-04-09 06:56:29 +10:00
|
|
|
.bind(("0.0.0.0", port))?
|
2023-04-03 07:53:55 +10:00
|
|
|
.run()
|
|
|
|
.await
|
|
|
|
}
|