11use std:: convert:: { TryFrom , TryInto } ;
22use std:: fs;
3- use std:: net:: SocketAddr ;
43use std:: sync:: Arc ;
54
65use anyhow:: { bail, Context , Result } ;
@@ -38,12 +37,13 @@ use std::convert::Infallible;
3837use tls_listener:: TlsListener ;
3938
4039pub mod tls_config;
40+ use tls_config:: tls_acceptor;
4141
4242mod handlers;
4343mod ov_management;
4444use crate :: ov_management:: ov_filter;
4545
46- pub ( crate ) struct OwnerServiceUD {
46+ pub struct OwnerServiceUD {
4747 // Trusted keys
4848 #[ allow( dead_code) ]
4949 trusted_device_keys : X5Bag ,
@@ -58,6 +58,8 @@ pub(crate) struct OwnerServiceUD {
5858 > ,
5959 > ,
6060 session_store : Arc < fdo_http_wrapper:: server:: SessionStore > ,
61+ owner_server_https_cert : AbsolutePathBuf ,
62+ owner_server_https_key : AbsolutePathBuf ,
6163
6264 // Our keys
6365 owner_key : PKey < Private > ,
@@ -285,8 +287,8 @@ async fn main() -> Result<()> {
285287 . context ( "Error parsing configuration" ) ?;
286288
287289 // Bind information
288- let bind_addr = settings. bind . clone ( ) ;
289- let addr = SocketAddr :: from ( ( [ 0 , 0 , 0 , 0 ] , 8081 ) ) ;
290+ let bind_http_addr = settings. bind_http . clone ( ) ;
291+ let bind_https_addr = settings . bind_https . clone ( ) ;
290292
291293 // Trusted keys
292294 let trusted_device_keys = {
@@ -352,6 +354,8 @@ async fn main() -> Result<()> {
352354 // Stores
353355 ownership_voucher_store,
354356 session_store : session_store. clone ( ) ,
357+ owner_server_https_cert : settings. owner_server_https_cert ,
358+ owner_server_https_key : settings. owner_server_https_key ,
355359
356360 // Trusted keys
357361 trusted_device_keys,
@@ -424,56 +428,75 @@ async fn main() -> Result<()> {
424428 let routes = warp:: post ( )
425429 . and (
426430 hello
427- . or ( handler_ping)
428- . or ( handler_report_to_rendezvous)
431+ . or ( handler_ping. clone ( ) )
432+ . or ( handler_report_to_rendezvous. clone ( ) )
429433 // TO2
430- . or ( handler_to2_hello_device)
431- . or ( handler_to2_get_ov_next_entry)
432- . or ( handler_to2_prove_device)
433- . or ( handler_to2_device_service_info_ready)
434- . or ( handler_to2_device_service_info)
435- . or ( handler_to2_done)
434+ . or ( handler_to2_hello_device. clone ( ) )
435+ . or ( handler_to2_get_ov_next_entry. clone ( ) )
436+ . or ( handler_to2_prove_device. clone ( ) )
437+ . or ( handler_to2_device_service_info_ready. clone ( ) )
438+ . or ( handler_to2_device_service_info. clone ( ) )
439+ . or ( handler_to2_done. clone ( ) )
436440 . or ( ov_filter ( user_data. clone ( ) ) ) ,
437441 )
438442 . recover ( fdo_http_wrapper:: server:: handle_rejection)
439- . with ( warp:: log ( "owner-onboarding-service" ) ) ;
443+ . with ( warp:: log (
444+ "owner-onboarding-service to handle http and https" ,
445+ ) ) ;
440446
441- log:: info!( "Listening on {}" , addr) ;
442-
443- let service = warp:: service ( routes) ;
447+ let service = warp:: service ( routes. clone ( ) ) ;
444448
445449 let make_svc = hyper:: service:: make_service_fn ( move |_| {
446450 let svc = service. clone ( ) ;
447451 async move { Ok :: < _ , Infallible > ( svc) }
448452 } ) ;
449453
450454 let incoming = TlsListener :: new (
451- tls_config:: tls_config:: tls_acceptor ( ) ,
452- AddrIncoming :: bind ( & addr) ?,
455+ tls_acceptor ( user_data. clone ( ) ) ,
456+ AddrIncoming :: bind ( & bind_https_addr. into ( ) ) ?,
457+ ) ;
458+ let https_server = hyper:: Server :: builder ( incoming) . serve ( make_svc) ;
459+ let https_server = https_server. with_graceful_shutdown ( async {
460+ signal ( SignalKind :: terminate ( ) ) . unwrap ( ) . recv ( ) . await ;
461+ log:: info!( "Terminating HTTPS server" ) ;
462+ } ) ;
463+ let https_server_handle = tokio:: spawn ( https_server) ;
464+
465+ let http_server = warp:: serve ( routes. clone ( ) ) ;
466+ let http_server = http_server
467+ . bind_with_graceful_shutdown ( bind_http_addr, async {
468+ signal ( SignalKind :: terminate ( ) ) . unwrap ( ) . recv ( ) . await ;
469+ log:: info!( "Terminating HTTP server" ) ;
470+ } )
471+ . 1 ;
472+ let http_server_handle = tokio:: spawn ( http_server) ;
473+
474+ let maintenance_runner_handle =
475+ tokio:: spawn ( async move { perform_maintenance ( user_data. clone ( ) ) . await } ) ;
476+
477+ log:: info!( "starting both servers with http & https support" ) ;
478+ // Join all the three handlers and wait
479+ let ( http_result, https_result, maintenance_result) = tokio:: join!(
480+ http_server_handle,
481+ https_server_handle,
482+ maintenance_runner_handle
453483 ) ;
454- let server = hyper:: Server :: builder ( incoming) . serve ( make_svc) ;
455- log:: info!( "starting at https://{}" , addr) ;
456- server. await ?;
457- // let server = warp::serve(routes);
458-
459- // let maintenance_runner =
460- // tokio::spawn(async move { perform_maintenance(user_data.clone()).await });
461-
462- // let server = server
463- // .bind_with_graceful_shutdown(bind_addr, async {
464- // signal(SignalKind::terminate()).unwrap().recv().await;
465- // log::info!("Terminating");
466- // })
467- // .1;
468- // let server = tokio::spawn(server);
469-
470- // tokio::select!(
471- // _ = server => {
472- // log::info!("Server terminated");
473- // },
474- // _ = maintenance_runner => {
475- // log::info!("Maintenance runner terminated");
476- // });
484+
485+ // Check the results and handle accordingly since we have joined
486+ match http_result {
487+ Ok ( _) => log:: info!( "HTTP server terminated successfully" ) ,
488+ Err ( err) => log:: error!( "HTTP server terminated with an error: {:?}" , err) ,
489+ }
490+
491+ match https_result {
492+ Ok ( _) => log:: info!( "HTTPS server terminated successfully" ) ,
493+ Err ( err) => log:: error!( "HTTPS server terminated with an error: {:?}" , err) ,
494+ }
495+
496+ match maintenance_result {
497+ Ok ( _) => log:: info!( "Maintenance runner terminated successfully" ) ,
498+ Err ( err) => log:: error!( "Maintenance runner terminated with an error: {:?}" , err) ,
499+ }
477500
478501 Ok ( ( ) )
479502}
0 commit comments