#[macro_use] extern crate log; #[macro_use] extern crate mockall; #[macro_use] extern crate mockall_double; // because of linking errors extern crate openssl; #[macro_use] extern crate diesel; // mod db; mod filters; mod handlers; use db::UDB; use filters::make_filters; use u_lib::{config::MASTER_PORT, models::*, utils::init_env}; use warp::Filter; const LOGFILE: &str = "u_server.log"; fn prefill_jobs() { let agent_hello = JobMeta::builder() .with_type(misc::JobType::Manage) .with_alias("agent_hello") .build() .unwrap(); UDB::lock_db().insert_jobs(&[agent_hello]).ok(); } fn init_logger() { use simplelog::*; use std::fs::OpenOptions; let log_cfg = ConfigBuilder::new() .set_time_format_str("%x %X") .set_time_to_local(true) .build(); let logfile = OpenOptions::new() .append(true) .create(true) .open(LOGFILE) .unwrap(); let level = LevelFilter::Info; let loggers = vec![ WriteLogger::new(level, log_cfg.clone(), logfile) as Box, TermLogger::new(level, log_cfg, TerminalMode::Stderr, ColorChoice::Auto), ]; CombinedLogger::init(loggers).unwrap(); } fn init_all() { init_logger(); init_env(); prefill_jobs(); } pub async fn serve() { init_all(); let routes = make_filters(); warp::serve(routes.with(warp::log("warp"))) .tls() .cert_path("./certs/server.crt") .key_path("./certs/server.key") .client_auth_required_path("./certs/ca.crt") .run(([0, 0, 0, 0], MASTER_PORT)) .await; } #[cfg(test)] mod tests { use super::*; #[double] use crate::handlers::Endpoints; use handlers::build_ok; use mockall::predicate::*; use test_case::test_case; use u_lib::messaging::{AsMsg, BaseMessage}; use uuid::Uuid; use warp::test::request; #[test_case(Some(Uuid::new_v4()))] #[test_case(None => panics)] #[tokio::test] async fn test_get_agent_jobs_unauthorized(uid: Option) { let mock = Endpoints::get_agent_jobs_context(); mock.expect().with(eq(uid)).returning(|_| Ok(build_ok(""))); request() .path(&format!( "/get_agent_jobs/{}", uid.map(|u| u.simple().to_string()).unwrap_or(String::new()) )) .method("GET") .filter(&make_filters()) .await .unwrap(); mock.checkpoint(); } #[tokio::test] async fn test_report_unauth_successful() { let mock = Endpoints::report_context(); mock.expect() .withf(|msg: &BaseMessage<'_, Vec>| msg.inner_ref()[0] == ExecResult::Dummy) .returning(|_| Ok(build_ok(""))); request() .path("/report/") .method("POST") .json(&vec![ExecResult::Dummy].as_message()) .filter(&make_filters()) .await .unwrap(); mock.checkpoint(); } }