@ -38,6 +38,10 @@ impl Fairing for AppHeaders {
let req_uri_path = req . uri ( ) . path ( ) ;
let req_uri_path = req . uri ( ) . path ( ) ;
// Do not send the Content-Security-Policy (CSP) Header and X-Frame-Options for the *-connector.html files.
// This can cause issues when some MFA requests needs to open a popup or page within the clients like WebAuthn, or Duo.
// This is the same behaviour as upstream Bitwarden.
if ! req_uri_path . ends_with ( "connector.html" ) {
// Check if we are requesting an admin page, if so, allow unsafe-inline for scripts.
// Check if we are requesting an admin page, if so, allow unsafe-inline for scripts.
// TODO: In the future maybe we need to see if we can generate a sha256 hash or have no scripts inline at all.
// TODO: In the future maybe we need to see if we can generate a sha256 hash or have no scripts inline at all.
let admin_path = format! ( "{}/admin" , CONFIG . domain_path ( ) ) ;
let admin_path = format! ( "{}/admin" , CONFIG . domain_path ( ) ) ;
@ -46,10 +50,6 @@ impl Fairing for AppHeaders {
script_src = " 'unsafe-inline'" ;
script_src = " 'unsafe-inline'" ;
}
}
// Do not send the Content-Security-Policy (CSP) Header and X-Frame-Options for the *-connector.html files.
// This can cause issues when some MFA requests needs to open a popup or page within the clients like WebAuthn, or Duo.
// This is the same behaviour as upstream Bitwarden.
if ! req_uri_path . ends_with ( "connector.html" ) {
// # Frame Ancestors:
// # Frame Ancestors:
// Chrome Web Store: https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb
// Chrome Web Store: https://chrome.google.com/webstore/detail/bitwarden-free-password-m/nngceckbapebfimnlniiiahkandclblb
// Edge Add-ons: https://microsoftedge.microsoft.com/addons/detail/bitwarden-free-password/jbkfoedolllekgbhcbcoahefnbanhhlh?hl=en-US
// Edge Add-ons: https://microsoftedge.microsoft.com/addons/detail/bitwarden-free-password/jbkfoedolllekgbhcbcoahefnbanhhlh?hl=en-US
@ -65,13 +65,14 @@ impl Fairing for AppHeaders {
" default - src ' self ' ; \
" default - src ' self ' ; \
script - src ' self ' { script_src } ; \
script - src ' self ' { script_src } ; \
style - src ' self ' ' unsafe - inline ' ; \
style - src ' self ' ' unsafe - inline ' ; \
img - src ' self ' data : https ://haveibeenpwned.com/ https://www.gravatar.com ; \
img - src ' self ' data : https ://haveibeenpwned.com/ https://www.gravatar.com {icon_service_csp} ; \
child - src ' self ' https ://*.duosecurity.com https://*.duofederal.com; \
child - src ' self ' https ://*.duosecurity.com https://*.duofederal.com; \
frame - src ' self ' https ://*.duosecurity.com https://*.duofederal.com; \
frame - src ' self ' https ://*.duosecurity.com https://*.duofederal.com; \
connect - src ' self ' https ://api.pwnedpasswords.com/range/ https://2fa.directory/api/ https://app.simplelogin.io/api/ https://app.anonaddy.com/api/ https://relay.firefox.com/api/; \
connect - src ' self ' https ://api.pwnedpasswords.com/range/ https://2fa.directory/api/ https://app.simplelogin.io/api/ https://app.anonaddy.com/api/ https://relay.firefox.com/api/; \
object - src ' self ' blob :; \
object - src ' self ' blob :; \
frame - ancestors ' self ' chrome - extension ://nngceckbapebfimnlniiiahkandclblb chrome-extension://jbkfoedolllekgbhcbcoahefnbanhhlh moz-extension://* {};",
frame - ancestors ' self ' chrome - extension ://nngceckbapebfimnlniiiahkandclblb chrome-extension://jbkfoedolllekgbhcbcoahefnbanhhlh moz-extension://* {allowed_iframe_ancestors};",
CONFIG . allowed_iframe_ancestors ( )
icon_service_csp = CONFIG . _icon_service_csp ( ) ,
allowed_iframe_ancestors = CONFIG . allowed_iframe_ancestors ( )
) ;
) ;
res . set_raw_header ( "Content-Security-Policy" , csp ) ;
res . set_raw_header ( "Content-Security-Policy" , csp ) ;
res . set_raw_header ( "X-Frame-Options" , "SAMEORIGIN" ) ;
res . set_raw_header ( "X-Frame-Options" , "SAMEORIGIN" ) ;