157 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| use actix_cors::Cors;
 | |
| use actix_identity::IdentityMiddleware;
 | |
| use actix_identity::config::LogoutBehavior;
 | |
| use actix_remote_ip::RemoteIPConfig;
 | |
| use actix_session::SessionMiddleware;
 | |
| use actix_session::storage::CookieSessionStore;
 | |
| use actix_web::cookie::{Key, SameSite};
 | |
| use actix_web::middleware::Logger;
 | |
| use actix_web::web::Data;
 | |
| use actix_web::{App, HttpServer, web};
 | |
| use light_openid::basic_state_manager::BasicStateManager;
 | |
| use remote_backend::app_config::AppConfig;
 | |
| use remote_backend::constants;
 | |
| use remote_backend::controllers::{
 | |
|     auth_controller, group_controller, server_controller, static_controller, sys_info_controller,
 | |
|     vm_controller,
 | |
| };
 | |
| use remote_backend::middlewares::auth_middleware::AuthChecker;
 | |
| use std::time::Duration;
 | |
| 
 | |
| #[actix_web::main]
 | |
| async fn main() -> std::io::Result<()> {
 | |
|     env_logger::init_from_env(env_logger::Env::new().default_filter_or("info"));
 | |
| 
 | |
|     let state_manager = Data::new(BasicStateManager::new());
 | |
| 
 | |
|     HttpServer::new(move || {
 | |
|         let session_mw = SessionMiddleware::builder(
 | |
|             CookieSessionStore::default(),
 | |
|             Key::from(AppConfig::get().secret().as_bytes()),
 | |
|         )
 | |
|         .cookie_name(constants::SESSION_COOKIE_NAME.to_string())
 | |
|         .cookie_secure(AppConfig::get().cookie_secure)
 | |
|         .cookie_same_site(SameSite::Strict)
 | |
|         .cookie_domain(AppConfig::get().cookie_domain())
 | |
|         .cookie_http_only(true)
 | |
|         .build();
 | |
| 
 | |
|         let identity_middleware = IdentityMiddleware::builder()
 | |
|             .logout_behavior(LogoutBehavior::PurgeSession)
 | |
|             .visit_deadline(Some(Duration::from_secs(
 | |
|                 constants::MAX_INACTIVITY_DURATION,
 | |
|             )))
 | |
|             .login_deadline(Some(Duration::from_secs(constants::MAX_SESSION_DURATION)))
 | |
|             .build();
 | |
| 
 | |
|         let cors = Cors::default()
 | |
|             .allowed_origin(&AppConfig::get().website_origin)
 | |
|             .allowed_methods(vec!["GET", "POST", "PUT", "PATCH", "DELETE"])
 | |
|             .allowed_header("X-Auth-Token")
 | |
|             .allow_any_header()
 | |
|             .supports_credentials()
 | |
|             .max_age(3600);
 | |
| 
 | |
|         App::new()
 | |
|             .wrap(Logger::default())
 | |
|             .wrap(AuthChecker)
 | |
|             .wrap(identity_middleware)
 | |
|             .wrap(session_mw)
 | |
|             .wrap(cors)
 | |
|             .app_data(state_manager.clone())
 | |
|             .app_data(Data::new(RemoteIPConfig {
 | |
|                 proxy: AppConfig::get().proxy_ip.clone(),
 | |
|             }))
 | |
|             // Server routes
 | |
|             .route(
 | |
|                 "/api/server/config",
 | |
|                 web::get().to(server_controller::config),
 | |
|             )
 | |
|             .route(
 | |
|                 "/api/auth/start_oidc",
 | |
|                 web::get().to(auth_controller::start_oidc),
 | |
|             )
 | |
|             .route(
 | |
|                 "/api/auth/finish_oidc",
 | |
|                 web::post().to(auth_controller::finish_oidc),
 | |
|             )
 | |
|             .route(
 | |
|                 "/api/auth/user",
 | |
|                 web::get().to(auth_controller::current_user),
 | |
|             )
 | |
|             .route(
 | |
|                 "/api/auth/sign_out",
 | |
|                 web::get().to(auth_controller::sign_out),
 | |
|             )
 | |
|             .route(
 | |
|                 "/api/server/rights",
 | |
|                 web::get().to(server_controller::rights),
 | |
|             )
 | |
|             // Groups routes
 | |
|             .route(
 | |
|                 "/api/group/{gid}/vm/state",
 | |
|                 web::get().to(group_controller::vm_state),
 | |
|             )
 | |
|             .route(
 | |
|                 "/api/group/{gid}/vm/start",
 | |
|                 web::get().to(group_controller::vm_start),
 | |
|             )
 | |
|             .route(
 | |
|                 "/api/group/{gid}/vm/shutdown",
 | |
|                 web::get().to(group_controller::vm_shutdown),
 | |
|             )
 | |
|             .route(
 | |
|                 "/api/group/{gid}/vm/kill",
 | |
|                 web::get().to(group_controller::vm_kill),
 | |
|             )
 | |
|             .route(
 | |
|                 "/api/group/{gid}/vm/reset",
 | |
|                 web::get().to(group_controller::vm_reset),
 | |
|             )
 | |
|             .route(
 | |
|                 "/api/group/{gid}/vm/suspend",
 | |
|                 web::get().to(group_controller::vm_suspend),
 | |
|             )
 | |
|             .route(
 | |
|                 "/api/group/{gid}/vm/resume",
 | |
|                 web::get().to(group_controller::vm_resume),
 | |
|             )
 | |
|             .route(
 | |
|                 "/api/group/{gid}/vm/screenshot",
 | |
|                 web::get().to(group_controller::vm_screenshot),
 | |
|             )
 | |
|             // VM routes
 | |
|             .route("/api/vm/{uid}/state", web::get().to(vm_controller::state))
 | |
|             .route("/api/vm/{uid}/start", web::get().to(vm_controller::start))
 | |
|             .route(
 | |
|                 "/api/vm/{uid}/shutdown",
 | |
|                 web::get().to(vm_controller::shutdown),
 | |
|             )
 | |
|             .route("/api/vm/{uid}/kill", web::get().to(vm_controller::kill))
 | |
|             .route("/api/vm/{uid}/reset", web::get().to(vm_controller::reset))
 | |
|             .route(
 | |
|                 "/api/vm/{uid}/suspend",
 | |
|                 web::get().to(vm_controller::suspend),
 | |
|             )
 | |
|             .route("/api/vm/{uid}/resume", web::get().to(vm_controller::resume))
 | |
|             .route(
 | |
|                 "/api/vm/{uid}/screenshot",
 | |
|                 web::get().to(vm_controller::screenshot),
 | |
|             )
 | |
|             // Sys info routes
 | |
|             .route(
 | |
|                 "/api/sysinfo/status",
 | |
|                 web::get().to(sys_info_controller::status),
 | |
|             )
 | |
|             // Static assets
 | |
|             .route("/", web::get().to(static_controller::root_index))
 | |
|             .route(
 | |
|                 "/{tail:.*}",
 | |
|                 web::get().to(static_controller::serve_static_content),
 | |
|             )
 | |
|     })
 | |
|     .bind(&AppConfig::get().listen_address)?
 | |
|     .run()
 | |
|     .await
 | |
| }
 |