|  | @ -4,7 +4,7 @@ use rocket::{fs::NamedFile, http::ContentType, response::content::RawHtml as Htm | 
			
		
	
		
		
			
				
					|  |  | use serde_json::Value; |  |  | use serde_json::Value; | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | use crate::{ |  |  | use crate::{ | 
			
		
	
		
		
			
				
					
					|  |  |     api::{core::now, ApiResult}, |  |  |     api::{core::now, ApiResult, EmptyResult}, | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |     error::Error, |  |  |     error::Error, | 
			
		
	
		
		
			
				
					|  |  |     util::{Cached, SafeString}, |  |  |     util::{Cached, SafeString}, | 
			
		
	
		
		
			
				
					|  |  |     CONFIG, |  |  |     CONFIG, | 
			
		
	
	
		
		
			
				
					|  | @ -14,9 +14,9 @@ pub fn routes() -> Vec<Route> { | 
			
		
	
		
		
			
				
					|  |  |     // If addding more routes here, consider also adding them to
 |  |  |     // If addding more routes here, consider also adding them to
 | 
			
		
	
		
		
			
				
					|  |  |     // crate::utils::LOGGED_ROUTES to make sure they appear in the log
 |  |  |     // crate::utils::LOGGED_ROUTES to make sure they appear in the log
 | 
			
		
	
		
		
			
				
					|  |  |     if CONFIG.web_vault_enabled() { |  |  |     if CONFIG.web_vault_enabled() { | 
			
		
	
		
		
			
				
					
					|  |  |         routes![web_index, app_id, web_files, attachments, alive, static_files] |  |  |         routes![web_index, web_index_head, app_id, web_files, attachments, alive, alive_head, static_files] | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |     } else { |  |  |     } else { | 
			
		
	
		
		
			
				
					
					|  |  |         routes![attachments, alive, static_files] |  |  |         routes![attachments, alive, alive_head, static_files] | 
			
				
				
			
		
	
		
		
	
		
		
			
				
					|  |  |     } |  |  |     } | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
	
		
		
			
				
					|  | @ -43,6 +43,17 @@ async fn web_index() -> Cached<Option<NamedFile>> { | 
			
		
	
		
		
			
				
					|  |  |     Cached::short(NamedFile::open(Path::new(&CONFIG.web_vault_folder()).join("index.html")).await.ok(), false) |  |  |     Cached::short(NamedFile::open(Path::new(&CONFIG.web_vault_folder()).join("index.html")).await.ok(), false) | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | #[head("/")] | 
			
		
	
		
		
			
				
					|  |  |  |  |  | fn web_index_head() -> EmptyResult { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     // Add an explicit HEAD route to prevent uptime monitoring services from
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     // generating "No matching routes for HEAD /" error messages.
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     //
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     // Rocket automatically implements a HEAD route when there's a matching GET
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     // route, but relying on this behavior also means a spurious error gets
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     // logged due to <https://github.com/SergioBenitez/Rocket/issues/1098>.
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     Ok(()) | 
			
		
	
		
		
			
				
					|  |  |  |  |  | } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | #[get("/app-id.json")] |  |  | #[get("/app-id.json")] | 
			
		
	
		
		
			
				
					|  |  | fn app_id() -> Cached<(ContentType, Json<Value>)> { |  |  | fn app_id() -> Cached<(ContentType, Json<Value>)> { | 
			
		
	
		
		
			
				
					|  |  |     let content_type = ContentType::new("application", "fido.trusted-apps+json"); |  |  |     let content_type = ContentType::new("application", "fido.trusted-apps+json"); | 
			
		
	
	
		
		
			
				
					|  | @ -92,6 +103,13 @@ fn alive(_conn: DbConn) -> Json<String> { | 
			
		
	
		
		
			
				
					|  |  |     now() |  |  |     now() | 
			
		
	
		
		
			
				
					|  |  | } |  |  | } | 
			
		
	
		
		
			
				
					|  |  | 
 |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  | #[head("/alive")] | 
			
		
	
		
		
			
				
					|  |  |  |  |  | fn alive_head(_conn: DbConn) -> EmptyResult { | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     // Avoid logging spurious "No matching routes for HEAD /alive" errors
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     // due to <https://github.com/SergioBenitez/Rocket/issues/1098>.
 | 
			
		
	
		
		
			
				
					|  |  |  |  |  |     Ok(()) | 
			
		
	
		
		
			
				
					|  |  |  |  |  | } | 
			
		
	
		
		
			
				
					|  |  |  |  |  | 
 | 
			
		
	
		
		
			
				
					|  |  | #[get("/vw_static/<filename>")] |  |  | #[get("/vw_static/<filename>")] | 
			
		
	
		
		
			
				
					|  |  | pub fn static_files(filename: String) -> Result<(ContentType, &'static [u8]), Error> { |  |  | pub fn static_files(filename: String) -> Result<(ContentType, &'static [u8]), Error> { | 
			
		
	
		
		
			
				
					|  |  |     match filename.as_ref() { |  |  |     match filename.as_ref() { | 
			
		
	
	
		
		
			
				
					|  | 
 |