From a79334ea4c1b18e534bc5d66e1a2746c83a567c7 Mon Sep 17 00:00:00 2001 From: TheMardy Date: Sat, 16 Feb 2019 03:44:30 +0100 Subject: [PATCH 1/4] Added static email image routes --- src/api/web.rs | 13 ++++++++++++- src/static/images/logo-gray.png | Bin 0 -> 5431 bytes src/static/images/mail-github.png | Bin 0 -> 1349 bytes 3 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 src/static/images/logo-gray.png create mode 100644 src/static/images/mail-github.png diff --git a/src/api/web.rs b/src/api/web.rs index 9b08a723..5c341cc6 100644 --- a/src/api/web.rs +++ b/src/api/web.rs @@ -9,11 +9,12 @@ use rocket_contrib::json::Json; use serde_json::Value; use crate::util::Cached; +use crate::error::Error; use crate::CONFIG; pub fn routes() -> Vec { if CONFIG.web_vault_enabled() { - routes![web_index, app_id, web_files, attachments, alive] + routes![web_index, app_id, web_files, attachments, alive, images] } else { routes![attachments, alive] } @@ -62,3 +63,13 @@ fn alive() -> Json { Json(format_date(&Utc::now().naive_utc())) } + +#[get("/images/")] +fn images(filename: String) -> Result>, Error> { + let image_type = ContentType::new("image", "x-icon"); + match filename.as_ref() { + "mail-github.png" => Ok(Content(image_type , include_bytes!("../static/images/mail-github.png").to_vec())), + "logo-gray.png" => Ok(Content(image_type, include_bytes!("../static/images/logo-gray.png").to_vec())), + _ => err!("Image not found") + } +} \ No newline at end of file diff --git a/src/static/images/logo-gray.png b/src/static/images/logo-gray.png new file mode 100644 index 0000000000000000000000000000000000000000..05c3e5344a5d4df5d06aeb71a364eb11d73b3485 GIT binary patch literal 5431 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 literal 0 HcmV?d00001 diff --git a/src/static/images/mail-github.png b/src/static/images/mail-github.png new file mode 100644 index 0000000000000000000000000000000000000000..07935f116fe9b54db3721eb56119ff65bd9c92ad GIT binary patch literal 1349 zcmeAS@N?(olHy`uVBq!ia0vp^HXzKw3=&b&bYNg$oE_j3;tJ%>90h|i1XBMlo(_zj zj*=k1UQ5m7O5Nhujwc?Csf6;(BLEp1&reFH-y6H_w_D{C8D zJ9`I57k4jjUqAnVz>v_$*tqz_q~w&e%py84FZwvNv3p1%HxQ>IRzF?;U3 zMT?iNTD^AthAmrn?mKYw_?dI(FJ8WS{pPJZ_Z~fY_VVrfk6*w4{QdXjkgpk$4FT+%iZoA8a58D) zC@#Nmzx!_4_uG4uZ|}A9pU;0Q_~pZwOHciJ_pT~6v&v#^!WpZ`FDpNGS8}TbZI-+J zAuZTrQdELFw`NJQ=#9{WPVVh-Mh8#pSnY6R4$g4DyL4h@tL>Zkj1@VHTdRDMQ(5ow z*Dx1fxbsMQrjt+KLjHSybDCw>)XlO!9Uyk-R?1!&zG>tsALMbp%2d$h%Rez;qHiUGx5#ZiA&c80t`0v%DpjmJ zA8PLq$u`*FHt`t8QB{c@E`~kpHTe!W$R7=lSk@rerTXX839+6Wz^~r=8NnKI-R4%xZ}i(-(0aPl#=xr z3M9Tq%UgM^H#+v-@vJSIT;2YY4e>YHw|zVRqvy9^qvN#-zB${=Bf|d~tX&ZJ?nUyp z6ARXznU&7|;DNte-TT%X`_Ju_TexsO<9pc@Hi?-IXIQ>haW8x?QE|09I{aq9R)OTu zo3G52zKJor-uN-C^z?-(HF zJib!PcUFn{z2bys*1Hm>-4|A>ulcCAV6EXX+rW&(^#&i3vQ)0y7p#$=)i1d@DVcxu zk!Ai1B-4XWI$6gD^*9?l8us$tyPufBG|RKCtZ%V$`ZV6j7h)0*&uPvx>X+ETbT*Xj z6tl;qnV(M>U+9_euZB(S&E?81C-}cUsQ)H^&_GF|TwuO6FvBr;y85}Sb4q9e0ER}A APyhe` literal 0 HcmV?d00001 From 8526055bb77d3ef6bab019cfe8e8f66217f9eb2d Mon Sep 17 00:00:00 2001 From: TheMardy Date: Sat, 16 Feb 2019 03:48:23 +0100 Subject: [PATCH 2/4] Added images to email templates --- src/static/templates/email/invite_accepted.html.hbs | 8 ++------ src/static/templates/email/invite_confirmed.html.hbs | 8 ++------ src/static/templates/email/pw_hint_none.html.hbs | 8 ++------ src/static/templates/email/pw_hint_some.hbs | 1 + src/static/templates/email/pw_hint_some.html.hbs | 8 ++------ src/static/templates/email/send_org_invite.html.hbs | 8 ++------ 6 files changed, 11 insertions(+), 30 deletions(-) diff --git a/src/static/templates/email/invite_accepted.html.hbs b/src/static/templates/email/invite_accepted.html.hbs index 71b8d174..cb8e3c79 100644 --- a/src/static/templates/email/invite_accepted.html.hbs +++ b/src/static/templates/email/invite_accepted.html.hbs @@ -82,7 +82,7 @@ Invitation accepted @@ -118,11 +118,7 @@ Invitation accepted diff --git a/src/static/templates/email/invite_confirmed.html.hbs b/src/static/templates/email/invite_confirmed.html.hbs index 746f96ed..81b5fefb 100644 --- a/src/static/templates/email/invite_confirmed.html.hbs +++ b/src/static/templates/email/invite_confirmed.html.hbs @@ -82,7 +82,7 @@ Invitation to {{org_name}} confirmed
@@ -114,11 +114,7 @@ Invitation to {{org_name}} confirmed diff --git a/src/static/templates/email/pw_hint_none.html.hbs b/src/static/templates/email/pw_hint_none.html.hbs index 4b97e57f..ef13b15d 100644 --- a/src/static/templates/email/pw_hint_none.html.hbs +++ b/src/static/templates/email/pw_hint_none.html.hbs @@ -82,7 +82,7 @@ Sorry, you have no password hint...
@@ -113,11 +113,7 @@ Sorry, you have no password hint... diff --git a/src/static/templates/email/pw_hint_some.hbs b/src/static/templates/email/pw_hint_some.hbs index a2917a3d..f16dc2b1 100644 --- a/src/static/templates/email/pw_hint_some.hbs +++ b/src/static/templates/email/pw_hint_some.hbs @@ -3,5 +3,6 @@ Your master password hint You (or someone) recently requested your master password hint. Your hint is: "{{hint}}" +Log in: Web Vault If you did not request your master password hint you can safely ignore this email. diff --git a/src/static/templates/email/pw_hint_some.html.hbs b/src/static/templates/email/pw_hint_some.html.hbs index 44cb3856..99220718 100644 --- a/src/static/templates/email/pw_hint_some.html.hbs +++ b/src/static/templates/email/pw_hint_some.html.hbs @@ -82,7 +82,7 @@ Your master password hint
@@ -119,11 +119,7 @@ Your master password hint diff --git a/src/static/templates/email/send_org_invite.html.hbs b/src/static/templates/email/send_org_invite.html.hbs index 0d8f32a1..e32dd6f7 100644 --- a/src/static/templates/email/send_org_invite.html.hbs +++ b/src/static/templates/email/send_org_invite.html.hbs @@ -82,7 +82,7 @@ Join {{org_name}}
@@ -120,11 +120,7 @@ Join {{org_name}} From 84fb6aaddbb4665e481f1e7f3d5dd393dc88a34a Mon Sep 17 00:00:00 2001 From: TheMardy Date: Sun, 17 Feb 2019 01:08:24 +0100 Subject: [PATCH 3/4] Set correct MIME type --- src/api/web.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/api/web.rs b/src/api/web.rs index 5c341cc6..0c60a352 100644 --- a/src/api/web.rs +++ b/src/api/web.rs @@ -66,7 +66,7 @@ fn alive() -> Json { #[get("/images/")] fn images(filename: String) -> Result>, Error> { - let image_type = ContentType::new("image", "x-icon"); + let image_type = ContentType::new("image", "png"); match filename.as_ref() { "mail-github.png" => Ok(Content(image_type , include_bytes!("../static/images/mail-github.png").to_vec())), "logo-gray.png" => Ok(Content(image_type, include_bytes!("../static/images/logo-gray.png").to_vec())), From f0701657a9d225a169ba07fe7566cfaef18e42a2 Mon Sep 17 00:00:00 2001 From: TheMardy Date: Tue, 30 Apr 2019 16:08:53 +0200 Subject: [PATCH 4/4] Changed to Bitwarden_RS Logo --- src/static/images/logo-gray.png | Bin 5431 -> 7580 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/src/static/images/logo-gray.png b/src/static/images/logo-gray.png index 05c3e5344a5d4df5d06aeb71a364eb11d73b3485..b045df54c0c95f2e18ff48a75a8369565bc4142a 100644 GIT binary patch literal 7580 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