From 7cb19ef767142b773ab44a457940844589432a74 Mon Sep 17 00:00:00 2001 From: BlackDex Date: Sat, 8 May 2021 17:46:31 +0200 Subject: [PATCH] Updated branding, email and crates - Updated branding for admin and emails - Updated crates and some deprications - Removed newline-converter because this is built-in into lettre - Updated email templates to use a shared header and footer template - Also trigger SMTP SSL When TLS is selected without SSL Resolves #1641 --- Cargo.lock | 169 ++++++++--------- Cargo.toml | 11 +- src/api/icons.rs | 4 +- src/api/web.rs | 4 +- src/config.rs | 4 + src/error.rs | 2 - src/mail.rs | 9 +- src/static/images/hibp.png | Bin 9419 -> 7039 bytes src/static/images/logo-gray.png | Bin 5414 -> 2569 bytes src/static/images/shield-white.png | Bin 1824 -> 0 bytes src/static/images/vaultwarden-icon.png | Bin 0 -> 945 bytes src/static/templates/admin/base.hbs | 9 +- .../templates/email/change_email.html.hbs | 141 ++------------- src/static/templates/email/delete_account.hbs | 4 +- .../templates/email/delete_account.html.hbs | 157 +++------------- src/static/templates/email/email_footer.hbs | 25 +++ .../templates/email/email_footer_text.hbs | 3 + src/static/templates/email/email_header.hbs | 94 ++++++++++ .../templates/email/invite_accepted.hbs | 4 +- .../templates/email/invite_accepted.html.hbs | 151 ++-------------- .../templates/email/invite_confirmed.hbs | 4 +- .../templates/email/invite_confirmed.html.hbs | 143 ++------------- .../templates/email/new_device_logged_in.hbs | 4 +- .../email/new_device_logged_in.html.hbs | 171 +++--------------- src/static/templates/email/pw_hint_none.hbs | 4 +- .../templates/email/pw_hint_none.html.hbs | 151 ++-------------- src/static/templates/email/pw_hint_some.hbs | 4 +- .../templates/email/pw_hint_some.html.hbs | 163 +++-------------- .../templates/email/send_org_invite.hbs | 4 +- .../templates/email/send_org_invite.html.hbs | 157 +++------------- src/static/templates/email/smtp_test.hbs | 4 +- src/static/templates/email/smtp_test.html.hbs | 141 ++------------- .../templates/email/twofactor_email.hbs | 6 +- .../templates/email/twofactor_email.html.hbs | 131 +------------- src/static/templates/email/verify_email.hbs | 4 +- .../templates/email/verify_email.html.hbs | 157 +++------------- src/static/templates/email/welcome.hbs | 4 +- src/static/templates/email/welcome.html.hbs | 141 ++------------- .../templates/email/welcome_must_verify.hbs | 4 +- .../email/welcome_must_verify.html.hbs | 157 +++------------- 40 files changed, 482 insertions(+), 1863 deletions(-) delete mode 100644 src/static/images/shield-white.png create mode 100644 src/static/images/vaultwarden-icon.png create mode 100644 src/static/templates/email/email_footer.hbs create mode 100644 src/static/templates/email/email_footer_text.hbs create mode 100644 src/static/templates/email/email_header.hbs diff --git a/Cargo.lock b/Cargo.lock index 60b23a45..d5556192 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4,9 +4,9 @@ version = 3 [[package]] name = "addr2line" -version = "0.14.1" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a55f82cfe485775d02112886f4169bde0c5894d75e79ead7eafe7e40a25e45f7" +checksum = "03345e98af8f3d786b6d9f656ccfa6ac316d954e92bc4841f0bba20789d5fb5a" dependencies = [ "gimli", ] @@ -74,9 +74,9 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "backtrace" -version = "0.3.58" +version = "0.3.59" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88fb5a785d6b44fd9d6700935608639af1b8356de1e55d5f7c2740f4faa15d82" +checksum = "4717cfcbfaa661a0fd48f8453951837ae7e8f81e481fbb136e3202d72805a744" dependencies = [ "addr2line", "cc", @@ -338,10 +338,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea221b5284a47e40033bf9b66f35f984ec0ea2931eb03505246cd27a963f981b" [[package]] -name = "cpuid-bool" -version = "0.1.2" +name = "cpufeatures" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8aebca1129a03dc6dc2b127edd729435bbc4a37e1d5f4d7513165089ceb02634" +checksum = "dec1028182c380cc45a2e2c5ec841134f2dfd0f8f5f0a5bcd68004f81b5efdf4" +dependencies = [ + "libc", +] [[package]] name = "crc32fast" @@ -423,7 +426,7 @@ dependencies = [ "bitflags", "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.71", + "syn 1.0.72", ] [[package]] @@ -451,7 +454,7 @@ checksum = "45f5098f628d02a7a0f68ddba586fb61e80edec3bdc1be3b921f4ceec60858d3" dependencies = [ "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.71", + "syn 1.0.72", ] [[package]] @@ -543,6 +546,15 @@ version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" +[[package]] +name = "fastrand" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77b705829d1e87f762c2df6da140b26af5839e1033aa84aa5f56bb688e4e1bdb" +dependencies = [ + "instant", +] + [[package]] name = "fern" version = "0.6.0" @@ -691,7 +703,7 @@ dependencies = [ "proc-macro-hack", "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.71", + "syn 1.0.72", ] [[package]] @@ -779,9 +791,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.23.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6503fe142514ca4799d4c26297c4248239fe8838d827db6bd6065c6ed29a6ce" +checksum = "0e4075386626662786ddb0ec9081e7c7eeb1ba31951f447ca780ef9f5d568189" [[package]] name = "glob" @@ -810,14 +822,14 @@ dependencies = [ [[package]] name = "handlebars" -version = "3.5.4" +version = "3.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "580b6f551b29a3a02436318aed09ba1c58eea177dc49e39beac627ad356730a5" +checksum = "4498fc115fa7d34de968184e473529abb40eeb6be8bc5f7faba3d08c316cb3e3" dependencies = [ "log 0.4.14", "pest", "pest_derive", - "quick-error 2.0.0", + "quick-error 2.0.1", "serde", "serde_json", "walkdir", @@ -881,7 +893,7 @@ dependencies = [ "markup5ever", "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.71", + "syn 1.0.72", ] [[package]] @@ -897,9 +909,9 @@ dependencies = [ [[package]] name = "http-body" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dfb77c123b4e2f72a2069aeae0b4b4949cc7e966df277813fc16347e7549737" +checksum = "60daa14be0e0786db0f03a9e57cb404c9d756eed2b6c62b9ea98ec5743ec75a9" dependencies = [ "bytes 1.0.1", "http", @@ -908,15 +920,15 @@ dependencies = [ [[package]] name = "httparse" -version = "1.3.6" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc35c995b9d93ec174cf9a27d425c7892722101e14993cd227fdb51d70cf9589" +checksum = "4a1ce40d6fc9764887c2fdc7305c3dcc429ba11ff981c1509416afd5697e4437" [[package]] name = "httpdate" -version = "0.3.2" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47" +checksum = "05842d0d43232b23ccb7060ecb0f0626922c21f30012e97b767b30afd4a5d4b9" [[package]] name = "hyper" @@ -939,9 +951,9 @@ dependencies = [ [[package]] name = "hyper" -version = "0.14.5" +version = "0.14.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf09f61b52cfcf4c00de50df88ae423d6c02354e385a86341133b5338630ad1" +checksum = "1e5f105c494081baa3bf9e200b279e27ec1623895cd504c7dbef8d0b080fcf54" dependencies = [ "bytes 1.0.1", "futures-channel", @@ -980,29 +992,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6183ddfa99b85da61a140bea0efc93fdf56ceaa041b37d553518030827f9905" dependencies = [ "bytes 1.0.1", - "hyper 0.14.5", + "hyper 0.14.7", "native-tls", "tokio", "tokio-native-tls", ] -[[package]] -name = "hyperx" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "82566a1ace7f56f604d83b7b2c259c78e243d99c565f23d7b4ae34466442c5a2" -dependencies = [ - "base64 0.13.0", - "bytes 1.0.1", - "http", - "httparse", - "httpdate", - "language-tags", - "mime 0.3.16", - "percent-encoding 2.1.0", - "unicase 2.6.0", -] - [[package]] name = "idna" version = "0.1.5" @@ -1128,24 +1123,23 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "lettre" -version = "0.10.0-beta.3" +version = "0.10.0-beta.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "897171ed0e63da84c988b157106ad8b6532d7499aeeec906ce46b05415cc79d3" +checksum = "2b7fd0c394e97e38d87bd2dfdf91983ab406b044a0bfd4e5b5c82bdfa0324526" dependencies = [ "base64 0.13.0", + "fastrand", "hostname", - "hyperx", + "httpdate", "idna 0.2.3", "mime 0.3.16", "native-tls", "nom 6.1.2", "once_cell", "quoted_printable", - "rand 0.8.3", "regex", "serde", "tracing", - "uuid", ] [[package]] @@ -1272,7 +1266,7 @@ dependencies = [ "migrations_internals", "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.71", + "syn 1.0.72", ] [[package]] @@ -1438,12 +1432,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" -[[package]] -name = "newline-converter" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d6f81c2b19eebbc4249b3ca6aff70ae05bf18d6a99b7cc63cf0248774e640565" - [[package]] name = "nodrop" version = "0.1.14" @@ -1499,7 +1487,7 @@ checksum = "876a53fff98e03a936a674b29568b0e605f06b29372c2489ff4de23f1949743d" dependencies = [ "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.71", + "syn 1.0.72", ] [[package]] @@ -1546,9 +1534,9 @@ dependencies = [ [[package]] name = "object" -version = "0.23.0" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4" +checksum = "1a5b3dd1c072ee7963717671d1ca129f1048fda25edea6b752bfc71ac8854170" [[package]] name = "once_cell" @@ -1599,9 +1587,9 @@ dependencies = [ [[package]] name = "openssl-sys" -version = "0.9.62" +version = "0.9.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa52160d45fa2e7608d504b7c3a3355afed615e6d8b627a74458634ba21b69bd" +checksum = "b6b0d6fb7d80f877617dfcb014e605e2b5ab2fb0afdf27935219bb6bd984cb98" dependencies = [ "autocfg", "cc", @@ -1635,7 +1623,7 @@ dependencies = [ "rand 0.7.3", "sha-1 0.8.2", "slab", - "url 2.2.1", + "url 2.2.2", ] [[package]] @@ -1774,7 +1762,7 @@ dependencies = [ "pest_meta", "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.71", + "syn 1.0.72", ] [[package]] @@ -1828,9 +1816,9 @@ dependencies = [ [[package]] name = "pico-args" -version = "0.4.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d70072c20945e1ab871c472a285fc772aefd4f5407723c206242f2c6f94595d6" +checksum = "7d7afeb98c5a10e0bffcc7fc16e105b04d06729fac5fd6384aebf7ff5cb5a67d" [[package]] name = "pin-project" @@ -1849,7 +1837,7 @@ checksum = "48c950132583b500556b1efd71d45b319029f2b71518d979fcc208e16b42426f" dependencies = [ "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.71", + "syn 1.0.72", ] [[package]] @@ -1929,9 +1917,9 @@ checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" [[package]] name = "quick-error" -version = "2.0.0" +version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3ac73b1112776fc109b2e61909bc46c7e1bf0d7f690ffb1676553acce16d5cda" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" [[package]] name = "quote" @@ -2104,18 +2092,18 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.2.7" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85dd92e586f7355c633911e11f77f3d12f04b1b1bd76a198bd34ae3af8341ef2" +checksum = "742739e41cd49414de871ea5e549afb7e2a3ac77b589bcbebe8c82fab37147fc" dependencies = [ "bitflags", ] [[package]] name = "regex" -version = "1.5.3" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce5f1ceb7f74abbce32601642fcf8e8508a8a8991e0621c7d750295b9095702b" +checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" dependencies = [ "aho-corasick", "memchr", @@ -2151,7 +2139,7 @@ dependencies = [ "futures-util", "http", "http-body", - "hyper 0.14.5", + "hyper 0.14.7", "hyper-tls", "ipnet", "js-sys", @@ -2168,7 +2156,7 @@ dependencies = [ "tokio-native-tls", "tokio-socks", "tokio-util", - "url 2.2.1", + "url 2.2.2", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -2275,9 +2263,9 @@ dependencies = [ [[package]] name = "rustc-demangle" -version = "0.1.18" +version = "0.1.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6e3bad0ee36814ca07d7968269dd4b7ec89ec2da10c4bb613928d3077083c232" +checksum = "410f7acf3cb3a44527c5d9546bad4bf4e6c460915d5f9f2fc524498bfe8f70ce" [[package]] name = "rustc-hex" @@ -2418,7 +2406,7 @@ checksum = "b093b7a2bb58203b5da3056c05b4ec1fed827dcfdb37347a8841695263b3d06d" dependencies = [ "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.71", + "syn 1.0.72", ] [[package]] @@ -2471,13 +2459,13 @@ dependencies = [ [[package]] name = "sha-1" -version = "0.9.4" +version = "0.9.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfebf75d25bd900fd1e7d11501efab59bc846dbc76196839663e6637bba9f25f" +checksum = "b659df5fc3ce22274daac600ffb845300bd2125bcfaec047823075afdab81c00" dependencies = [ "block-buffer 0.9.0", "cfg-if 1.0.0", - "cpuid-bool", + "cpufeatures", "digest 0.9.0", "opaque-debug 0.3.0", ] @@ -2600,7 +2588,7 @@ dependencies = [ "quote 1.0.9", "serde", "serde_derive", - "syn 1.0.71", + "syn 1.0.72", ] [[package]] @@ -2616,7 +2604,7 @@ dependencies = [ "serde_derive", "serde_json", "sha1", - "syn 1.0.71", + "syn 1.0.72", ] [[package]] @@ -2669,9 +2657,9 @@ dependencies = [ [[package]] name = "syn" -version = "1.0.71" +version = "1.0.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad184cc9470f9117b2ac6817bfe297307418819ba40552f9b3846f05c33d5373" +checksum = "a1e8cdbefb79a9a5a65e0db8b47b723ee907b7c7f8496c76a1770b5c310bab82" dependencies = [ "proc-macro2 1.0.26", "quote 1.0.9", @@ -2738,7 +2726,7 @@ checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0" dependencies = [ "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.71", + "syn 1.0.72", ] [[package]] @@ -2796,7 +2784,7 @@ dependencies = [ "proc-macro2 1.0.26", "quote 1.0.9", "standback", - "syn 1.0.71", + "syn 1.0.72", ] [[package]] @@ -2901,7 +2889,7 @@ checksum = "c42e6fa53307c8a17e4ccd4dc81cf5ec38db9209f59b222210375b54ee40d1e2" dependencies = [ "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.71", + "syn 1.0.72", ] [[package]] @@ -3036,9 +3024,9 @@ dependencies = [ [[package]] name = "url" -version = "2.2.1" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ccd964113622c8e9322cfac19eb1004a07e636c545f325da085d5cdde6f1f8b" +checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c" dependencies = [ "form_urlencoded", "idna 0.2.3", @@ -3085,7 +3073,6 @@ dependencies = [ "log 0.4.14", "markup5ever_rcdom", "multipart", - "newline-converter", "num-derive", "num-traits", "oath", @@ -3186,7 +3173,7 @@ dependencies = [ "log 0.4.14", "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.71", + "syn 1.0.72", "wasm-bindgen-shared", ] @@ -3220,7 +3207,7 @@ checksum = "d53739ff08c8a68b0fdbcd54c372b8ab800b1449ab3c9d706503bc7dd1621b2c" dependencies = [ "proc-macro2 1.0.26", "quote 1.0.9", - "syn 1.0.71", + "syn 1.0.72", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3358,7 +3345,7 @@ dependencies = [ "hmac 0.10.1", "rand 0.8.3", "reqwest", - "sha-1 0.9.4", + "sha-1 0.9.5", "threadpool", "url 1.7.2", ] diff --git a/Cargo.toml b/Cargo.toml index a318b707..7282f066 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -103,16 +103,15 @@ num-derive = "0.3.3" # Email libraries tracing = { version = "0.1.26", features = ["log"] } # Needed to have lettre trace logging used when SMTP_DEBUG is enabled. -lettre = { version = "0.10.0-beta.3", features = ["smtp-transport", "builder", "serde", "native-tls", "hostname", "tracing"], default-features = false } -newline-converter = "0.2.0" +lettre = { version = "0.10.0-beta.4", features = ["smtp-transport", "builder", "serde", "native-tls", "hostname", "tracing"], default-features = false } # Template library -handlebars = { version = "3.5.4", features = ["dir_source"] } +handlebars = { version = "3.5.5", features = ["dir_source"] } # For favicon extraction from main website html5ever = "0.25.1" markup5ever_rcdom = "0.1.0" -regex = { version = "1.5.3", features = ["std", "perf"], default-features = false } +regex = { version = "1.5.4", features = ["std", "perf"], default-features = false } data-url = "0.1.0" # Used by U2F, JWT and Postgres @@ -124,10 +123,10 @@ percent-encoding = "2.1.0" idna = "0.2.3" # CLI argument parsing -pico-args = "0.4.0" +pico-args = "0.4.1" # Logging panics to logfile instead stderr only -backtrace = "0.3.58" +backtrace = "0.3.59" # Macro ident concatenation paste = "1.0.5" diff --git a/src/api/icons.rs b/src/api/icons.rs index b7674f3a..2b527285 100644 --- a/src/api/icons.rs +++ b/src/api/icons.rs @@ -389,7 +389,7 @@ fn get_favicons_node(node: &std::rc::Rc, icons: &mut Ve if has_rel { if let Some(inner_href) = href { - if let Ok(full_href) = url.join(&inner_href).map(|h| h.into_string()) { + if let Ok(full_href) = url.join(&inner_href).map(String::from) { let priority = get_icon_priority(&full_href, sizes); icons.push(Icon::new(priority, full_href)); } @@ -499,7 +499,7 @@ fn get_icon_url(domain: &str) -> Result { referer = url.as_str().to_string(); // Add the default favicon.ico to the list with the domain the content responded from. - iconlist.push(Icon::new(35, url.join("/favicon.ico").unwrap().into_string())); + iconlist.push(Icon::new(35, String::from(url.join("/favicon.ico").unwrap()))); // 512KB should be more than enough for the HTML, though as we only really need // the HTML header, it could potentially be reduced even further diff --git a/src/api/web.rs b/src/api/web.rs index 29c64ae4..1416da0d 100644 --- a/src/api/web.rs +++ b/src/api/web.rs @@ -78,9 +78,11 @@ fn static_files(filename: String) -> Result, Error> { match filename.as_ref() { "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"))), - "shield-white.png" => Ok(Content(ContentType::PNG, include_bytes!("../static/images/shield-white.png"))), "error-x.svg" => Ok(Content(ContentType::SVG, include_bytes!("../static/images/error-x.svg"))), "hibp.png" => Ok(Content(ContentType::PNG, include_bytes!("../static/images/hibp.png"))), + "vaultwarden-icon.png" => { + Ok(Content(ContentType::PNG, include_bytes!("../static/images/vaultwarden-icon.png"))) + } "bootstrap.css" => Ok(Content(ContentType::CSS, include_bytes!("../static/scripts/bootstrap.css"))), "bootstrap-native.js" => { diff --git a/src/config.rs b/src/config.rs index fa7db32c..1a7c4c9e 100644 --- a/src/config.rs +++ b/src/config.rs @@ -832,6 +832,10 @@ where } // First register default templates here + reg!("email/email_header"); + reg!("email/email_footer"); + reg!("email/email_footer_text"); + reg!("email/change_email", ".html"); reg!("email/delete_account", ".html"); reg!("email/invite_accepted", ".html"); diff --git a/src/error.rs b/src/error.rs index e8fa7613..52275cf1 100644 --- a/src/error.rs +++ b/src/error.rs @@ -50,7 +50,6 @@ use yubico::yubicoerror::YubicoError as YubiErr; use lettre::address::AddressError as AddrErr; use lettre::error::Error as LettreErr; -use lettre::message::mime::FromStrError as FromStrErr; use lettre::transport::smtp::Error as SmtpErr; #[derive(Serialize)] @@ -84,7 +83,6 @@ make_error! { LettreError(LettreErr): _has_source, _api_error, AddressError(AddrErr): _has_source, _api_error, SmtpError(SmtpErr): _has_source, _api_error, - FromStrError(FromStrErr): _has_source, _api_error, DieselConError(DieselConErr): _has_source, _api_error, DieselMigError(DieselMigErr): _has_source, _api_error, diff --git a/src/mail.rs b/src/mail.rs index 025a1a9a..1cd875b8 100644 --- a/src/mail.rs +++ b/src/mail.rs @@ -27,7 +27,7 @@ fn mailer() -> SmtpTransport { .timeout(Some(Duration::from_secs(CONFIG.smtp_timeout()))); // Determine security - let smtp_client = if CONFIG.smtp_ssl() { + let smtp_client = if CONFIG.smtp_ssl() || CONFIG.smtp_explicit_tls() { let mut tls_parameters = TlsParameters::builder(host); if CONFIG.smtp_accept_invalid_hostnames() { tls_parameters = tls_parameters.dangerous_accept_invalid_hostnames(true); @@ -99,9 +99,8 @@ fn get_template(template_name: &str, data: &serde_json::Value) -> Result<(String None => err!("Template doesn't contain subject"), }; - use newline_converter::unix2dos; let body = match text_split.next() { - Some(s) => unix2dos(s.trim()).to_string(), + Some(s) => s.trim().to_string(), None => err!("Template doesn't contain body"), }; @@ -307,13 +306,13 @@ fn send_email(address: &str, subject: &str, body_html: String, body_text: String let html = SinglePart::builder() // We force Base64 encoding because in the past we had issues with different encodings. .header(header::ContentTransferEncoding::Base64) - .header(header::ContentType("text/html; charset=utf-8".parse()?)) + .header(header::ContentType::TEXT_HTML) .body(body_html); let text = SinglePart::builder() // We force Base64 encoding because in the past we had issues with different encodings. .header(header::ContentTransferEncoding::Base64) - .header(header::ContentType("text/plain; charset=utf-8".parse()?)) + .header(header::ContentType::TEXT_PLAIN) .body(body_text); let smtp_from = &CONFIG.smtp_from(); diff --git a/src/static/images/hibp.png b/src/static/images/hibp.png index 99d485a5cdc27e5f9d7f265906978e43d93397d1..568b99b7459398bff4bda50248341ebe84bb4ff5 100644 GIT binary patch literal 7039 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

VGuU3iV{Rolle(Zs_=r$H95 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 f4T*0frhoYt+|s;=4zJqe00000NkvXXu0mjfW literal 5414 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 Qxc~qF07*qoM6N<$f+_Hnw*UYD diff --git a/src/static/images/shield-white.png b/src/static/images/shield-white.png deleted file mode 100644 index ae5db28a5f29649ae49c1c254c0cab1b77b459ba..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1824 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 TxDfBK00000NkvXXu0mjfNanv^ literal 0 HcmV?d00001 diff --git a/src/static/templates/admin/base.hbs b/src/static/templates/admin/base.hbs index e476309d..d1c41a4a 100644 --- a/src/static/templates/admin/base.hbs +++ b/src/static/templates/admin/base.hbs @@ -4,7 +4,7 @@ - + Vaultwarden Admin Panel @@ -83,7 +84,7 @@