2018-02-10 01:00:55 +01:00
use std ::path ::{ Path , PathBuf } ;
2020-07-14 18:00:09 +02:00
use rocket ::{ http ::ContentType , response ::content ::Content , response ::NamedFile , Route } ;
2018-10-10 20:40:39 +02:00
use rocket_contrib ::json ::Json ;
use serde_json ::Value ;
2018-02-10 01:00:55 +01:00
2020-07-14 18:00:09 +02:00
use crate ::{ error ::Error , util ::Cached , CONFIG } ;
2018-02-10 01:00:55 +01:00
pub fn routes ( ) -> Vec < Route > {
2019-12-27 18:37:14 +01:00
// If addding more routes here, consider also adding them to
2019-12-06 22:19:07 +01:00
// crate::utils::LOGGED_ROUTES to make sure they appear in the log
2019-01-25 18:23:51 +01:00
if CONFIG . web_vault_enabled ( ) {
2021-03-14 23:35:55 +01:00
routes! [ web_index , app_id , web_files , attachments , sends , alive , static_files ]
2018-06-12 21:09:42 +02:00
} else {
2019-08-31 17:25:31 +02:00
routes! [ attachments , alive , static_files ]
2018-06-12 21:09:42 +02:00
}
2018-02-10 01:00:55 +01:00
}
#[ get( " / " ) ]
2019-09-17 21:05:56 +02:00
fn web_index ( ) -> Cached < Option < NamedFile > > {
2019-12-27 18:37:14 +01:00
Cached ::short ( NamedFile ::open ( Path ::new ( & CONFIG . web_vault_folder ( ) ) . join ( " index.html " ) ) . ok ( ) )
2018-02-10 01:00:55 +01:00
}
2018-07-12 21:46:50 +02:00
#[ get( " /app-id.json " ) ]
2018-12-23 22:37:02 +01:00
fn app_id ( ) -> Cached < Content < Json < Value > > > {
2018-07-13 15:05:00 +02:00
let content_type = ContentType ::new ( " application " , " fido.trusted-apps+json " ) ;
2018-12-23 22:37:02 +01:00
Cached ::long ( Content (
content_type ,
Json ( json! ( {
" trustedFacets " : [
{
" version " : { " major " : 1 , " minor " : 0 } ,
" ids " : [
2020-02-19 06:27:00 +01:00
// Per <https://fidoalliance.org/specs/fido-v2.0-id-20180227/fido-appid-and-facets-v2.0-id-20180227.html#determining-the-facetid-of-a-calling-application>:
//
// "In the Web case, the FacetID MUST be the Web Origin [RFC6454]
// of the web page triggering the FIDO operation, written as
// a URI with an empty path. Default ports are omitted and any
// path component is ignored."
//
// This leaves it unclear as to whether the path must be empty,
// or whether it can be non-empty and will be ignored. To be on
// the safe side, use a proper web origin (with empty path).
& CONFIG . domain_origin ( ) ,
2018-12-23 22:37:02 +01:00
" ios:bundle-id:com.8bit.bitwarden " ,
" android:apk-key-hash:dUGFzUzf3lmHSLBDBIv+WaFyZMI " ]
} ]
} ) ) ,
) )
2018-07-12 21:46:50 +02:00
}
2019-01-19 21:36:34 +01:00
#[ get( " /<p..> " , rank = 10) ] // Only match this if the other routes don't match
2019-09-17 21:05:56 +02:00
fn web_files ( p : PathBuf ) -> Cached < Option < NamedFile > > {
Cached ::long ( NamedFile ::open ( Path ::new ( & CONFIG . web_vault_folder ( ) ) . join ( p ) ) . ok ( ) )
2018-02-10 01:00:55 +01:00
}
2018-02-15 00:40:34 +01:00
#[ get( " /attachments/<uuid>/<file..> " ) ]
2019-09-17 21:05:56 +02:00
fn attachments ( uuid : String , file : PathBuf ) -> Option < NamedFile > {
NamedFile ::open ( Path ::new ( & CONFIG . attachments_folder ( ) ) . join ( uuid ) . join ( file ) ) . ok ( )
2018-02-10 01:00:55 +01:00
}
2021-03-14 23:35:55 +01:00
#[ get( " /sends/<send_id>/<file_id> " ) ]
fn sends ( send_id : String , file_id : String ) -> Option < NamedFile > {
NamedFile ::open ( Path ::new ( & CONFIG . sends_folder ( ) ) . join ( send_id ) . join ( file_id ) ) . ok ( )
}
2018-02-10 01:00:55 +01:00
#[ get( " /alive " ) ]
fn alive ( ) -> Json < String > {
2018-12-07 02:05:45 +01:00
use crate ::util ::format_date ;
2018-02-15 00:53:11 +01:00
use chrono ::Utc ;
2018-02-10 01:00:55 +01:00
Json ( format_date ( & Utc ::now ( ) . naive_utc ( ) ) )
}
2019-02-16 03:44:30 +01:00
2019-08-31 17:25:31 +02:00
#[ get( " /bwrs_static/<filename> " ) ]
fn static_files ( filename : String ) -> Result < Content < & 'static [ u8 ] > , Error > {
2019-02-16 03:44:30 +01:00
match filename . as_ref ( ) {
2019-08-20 20:07:12 +02:00
" mail-github.png " = > Ok ( Content ( ContentType ::PNG , include_bytes! ( " ../static/images/mail-github.png " ) ) ) ,
" logo-gray.png " = > Ok ( Content ( ContentType ::PNG , include_bytes! ( " ../static/images/logo-gray.png " ) ) ) ,
2020-05-28 10:42:36 +02:00
" shield-white.png " = > Ok ( Content ( ContentType ::PNG , include_bytes! ( " ../static/images/shield-white.png " ) ) ) ,
2019-08-20 20:07:12 +02:00
" error-x.svg " = > Ok ( Content ( ContentType ::SVG , include_bytes! ( " ../static/images/error-x.svg " ) ) ) ,
2019-10-08 22:29:12 +02:00
" hibp.png " = > Ok ( Content ( ContentType ::PNG , include_bytes! ( " ../static/images/hibp.png " ) ) ) ,
2019-08-31 17:47:52 +02:00
" bootstrap.css " = > Ok ( Content ( ContentType ::CSS , include_bytes! ( " ../static/scripts/bootstrap.css " ) ) ) ,
2020-08-31 16:40:21 +02:00
" bootstrap-native.js " = > Ok ( Content ( ContentType ::JavaScript , include_bytes! ( " ../static/scripts/bootstrap-native.js " ) ) ) ,
2019-08-31 17:47:52 +02:00
" identicon.js " = > Ok ( Content ( ContentType ::JavaScript , include_bytes! ( " ../static/scripts/identicon.js " ) ) ) ,
2020-09-19 22:19:55 +02:00
" datatables.js " = > Ok ( Content ( ContentType ::JavaScript , include_bytes! ( " ../static/scripts/datatables.js " ) ) ) ,
" datatables.css " = > Ok ( Content ( ContentType ::CSS , include_bytes! ( " ../static/scripts/datatables.css " ) ) ) ,
" jquery-3.5.1.slim.js " = > Ok ( Content ( ContentType ::JavaScript , include_bytes! ( " ../static/scripts/jquery-3.5.1.slim.js " ) ) ) ,
2020-02-19 06:27:00 +01:00
_ = > err! ( format! ( " Static file not found: {} " , filename ) ) ,
2019-02-16 03:44:30 +01:00
}
2019-12-27 18:37:14 +01:00
}