diff --git a/Cargo.lock b/Cargo.lock index c103abfe..796b1659 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1901,6 +1901,7 @@ dependencies = [ "lettre", "lettre_email", "libc", + "log", "openssl-sys", "serde", "toml", diff --git a/actors/filesystem-actor/src/lib.rs b/actors/filesystem-actor/src/lib.rs index 2034cfa2..b003f3ef 100644 --- a/actors/filesystem-actor/src/lib.rs +++ b/actors/filesystem-actor/src/lib.rs @@ -51,6 +51,9 @@ impl actix::Handler for FileSystemExecutor { fn handle(&mut self, msg: CreateFile, _ctx: &mut Self::Context) -> Self::Result { let Configuration { store_path, .. } = &self.config; + if std::fs::metadata(&store_path).is_err() { + let _ = std::fs::create_dir_all(&store_path); + } let CreateFile { mut source, file_name, diff --git a/actors/mail-actor/Cargo.toml b/actors/mail-actor/Cargo.toml index 586ac8c4..f35126ff 100644 --- a/actors/mail-actor/Cargo.toml +++ b/actors/mail-actor/Cargo.toml @@ -30,6 +30,8 @@ libc = { version = "0.2.0", default-features = false } lettre = { version = "*" } lettre_email = { version = "*" } +log = { version = "*" } + [dependencies.jirs-config] path = "../../shared/jirs-config" features = ["mail", "web"] diff --git a/actors/mail-actor/src/welcome.rs b/actors/mail-actor/src/welcome.rs index 4ab8d3a6..67539fee 100644 --- a/actors/mail-actor/src/welcome.rs +++ b/actors/mail-actor/src/welcome.rs @@ -41,6 +41,9 @@ impl Handler for MailExecutor { "#, bind_token = msg.bind_token, ); + if cfg!(debug_assetrions) { + log::info!("Sending email:\n{}", html); + } let email = lettre_email::Email::builder() .from(from) diff --git a/actors/web-actor/Cargo.toml b/actors/web-actor/Cargo.toml index 118b39f9..33055cd9 100644 --- a/actors/web-actor/Cargo.toml +++ b/actors/web-actor/Cargo.toml @@ -15,7 +15,7 @@ path = "./src/lib.rs" [features] local-storage = ["filesystem-actor"] aws-s3 = ["amazon-actor"] -default = ["local-storage", "aws-s3"] +default = ["local-storage"] [dependencies] common = { path = "../../shared/common" } diff --git a/actors/web-actor/src/avatar.rs b/actors/web-actor/src/avatar.rs index dd462329..78d1d191 100644 --- a/actors/web-actor/src/avatar.rs +++ b/actors/web-actor/src/avatar.rs @@ -13,7 +13,7 @@ use database_actor::DbExecutor; #[cfg(feature = "local-storage")] use futures::executor::block_on; use futures::{StreamExt, TryStreamExt}; -use jirs_data::msg::WsMsgUser; +use jirs_data::msg::{WsMsg, WsMsgUser}; use jirs_data::{User, UserId}; use websocket_actor::server::InnerMsg::BroadcastToChannel; use websocket_actor::server::WsServer; @@ -136,7 +136,7 @@ pub async fn upload( let user = update_user_avatar(user_id, avatar_url.clone(), db).await?; ws.send(BroadcastToChannel( project_id, - WsMsg::AvatarUrlChanged(user.id, avatar_url), + WsMsg::User(WsMsgUser::AvatarUrlChanged(user.id, avatar_url)), )) .await .map_err(|_| HttpResponse::UnprocessableEntity().finish())?; diff --git a/actors/web-actor/src/handlers/upload_avatar_image.rs b/actors/web-actor/src/handlers/upload_avatar_image.rs index b97eafeb..3d4892a8 100644 --- a/actors/web-actor/src/handlers/upload_avatar_image.rs +++ b/actors/web-actor/src/handlers/upload_avatar_image.rs @@ -134,7 +134,7 @@ async fn aws_s3( async fn local_storage_write( system_file_name: String, fs: Data>, - user_id: jirs_data::UserId, + _user_id: jirs_data::UserId, receiver: Receiver, ) -> Option { let web_config = jirs_config::web::config(); @@ -148,15 +148,9 @@ async fn local_storage_write( .await { Ok(Ok(_)) => Some(format!( - "{proto}://{bind}{port}{client_path}/{user_id}-{filename}", - proto = if web_config.ssl { "https" } else { "http" }, - bind = web_config.bind, - port = match web_config.port.as_str() { - "80" | "443" => "".to_string(), - p => format!(":{}", p), - }, + "{addr}{client_path}/{filename}", + addr = web_config.full_addr(), client_path = fs_config.client_path, - user_id = user_id, filename = system_file_name )), Ok(_) => None, diff --git a/jirs-server/Cargo.toml b/jirs-server/Cargo.toml index ed06043c..b28bc342 100644 --- a/jirs-server/Cargo.toml +++ b/jirs-server/Cargo.toml @@ -47,6 +47,7 @@ path = "../actors/database-actor" [dependencies.web-actor] path = "../actors/web-actor" +features = ["local-storage"] [dependencies.websocket-actor] path = "../actors/websocket-actor" diff --git a/jirs-server/src/main.rs b/jirs-server/src/main.rs index 90627db0..0a2287bb 100644 --- a/jirs-server/src/main.rs +++ b/jirs-server/src/main.rs @@ -70,7 +70,7 @@ async fn main() -> Result<(), String> { app }) .workers(web_config.concurrency) - .bind(web_config.addr()) + .bind(web_config.bind_addr()) .map_err(|e| format!("{}", e))? .run() .await diff --git a/shared/jirs-config/src/web.rs b/shared/jirs-config/src/web.rs index d4dd76ae..512a915b 100644 --- a/shared/jirs-config/src/web.rs +++ b/shared/jirs-config/src/web.rs @@ -12,6 +12,7 @@ pub struct Configuration { pub port: String, pub bind: String, pub ssl: bool, + pub public_addr: Option, } impl Default for Configuration { @@ -21,12 +22,20 @@ impl Default for Configuration { port: "5000".to_string(), bind: "0.0.0.0".to_string(), ssl: false, + public_addr: None, } } } impl Configuration { pub fn addr(&self) -> String { + match self.public_addr.as_deref() { + Some(s) => String::from(s), + _ => format!("{}:{}", self.bind, self.port), + } + } + + pub fn bind_addr(&self) -> String { format!("{}:{}", self.bind, self.port) } diff --git a/web/src/lib.rs b/web/src/lib.rs index 2e9f1ec1..bb89678f 100644 --- a/web/src/lib.rs +++ b/web/src/lib.rs @@ -34,8 +34,8 @@ mod shared; pub mod validations; mod ws; -// #[global_allocator] -// static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; +#[global_allocator] +static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT; #[derive(Debug)] #[repr(C)] @@ -190,6 +190,7 @@ fn update(msg: Msg, model: &mut model::Model, orders: &mut impl Orders) { })); } Ok(m) => { + log::info!("INCOMING {:?}", m); orders .skip() .send_msg(Msg::WebSocketChange(WebSocketChanged::WsMsg(m))); @@ -200,6 +201,7 @@ fn update(msg: Msg, model: &mut model::Model, orders: &mut impl Orders) { } WebSocketChanged::WebSocketClosed => { open_socket(model, orders); + return; } WebSocketChanged::Bounced(ws_msg) => { model.ws_queue.push(ws_msg); @@ -207,7 +209,6 @@ fn update(msg: Msg, model: &mut model::Model, orders: &mut impl Orders) { return; } }; - Msg::WebSocketChange(change) } _ => msg, }; diff --git a/web/src/pages/sign_in_page/model.rs b/web/src/pages/sign_in_page/model.rs index 6c602093..24ff7652 100644 --- a/web/src/pages/sign_in_page/model.rs +++ b/web/src/pages/sign_in_page/model.rs @@ -5,9 +5,9 @@ use crate::validator; validator!(EmailFormat, is_email, "Not a valid e-mail address"); validator!(UuidFormat, is_token, "Malformed token"); -pub type UsernameValidator = Touched>; +pub type UsernameValidator = Touched>; pub type EmailValidator = Touched>, Changed>>; -pub type TokenValidator = Touched, Changed>>; +pub type TokenValidator = Touched, Changed>>; #[derive(Debug, Default)] pub struct SignInPage { diff --git a/web/src/ws/mod.rs b/web/src/ws/mod.rs index eea867e7..6a42a20d 100644 --- a/web/src/ws/mod.rs +++ b/web/src/ws/mod.rs @@ -432,7 +432,26 @@ pub fn update(msg: WsMsg, model: &mut Model, orders: &mut impl Orders) { Some(id), )); } - _ => (), + WsMsg::Session(WsMsgSession::AuthenticateSuccess) => { + let page = crate::match_page_mut!(model, SignIn); + page.login_success = true; + } + WsMsg::Session(WsMsgSession::BindTokenOk(access_token)) => { + match write_auth_token(Some(access_token)) { + Ok(msg) => { + orders.skip().send_msg(msg); + } + Err(e) => { + log::error!("{}", e); + } + } + } + _ => { + log::info!( + "got web socket message but don't know what to do with it {:?}", + msg + ); + } }; }