Add img protection
This commit is contained in:
parent
1681188214
commit
90d0eacca6
3 changed files with 294 additions and 189 deletions
455
Cargo.lock
generated
455
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -13,4 +13,6 @@ rust-embed = "8"
|
||||||
directories = "5"
|
directories = "5"
|
||||||
clap = "4"
|
clap = "4"
|
||||||
warp = "0.3"
|
warp = "0.3"
|
||||||
tokio = { version = "1", features = ["full"] }
|
tokio = { version = "1", features = ["full"] }
|
||||||
|
portpicker = "0.1"
|
||||||
|
rand = "0.8"
|
24
src/main.rs
24
src/main.rs
|
@ -4,6 +4,7 @@ use anyhow::{anyhow, bail, Result};
|
||||||
use clap::{Arg, Command};
|
use clap::{Arg, Command};
|
||||||
use log::info;
|
use log::info;
|
||||||
use native_dialog::{FileDialog, MessageDialog};
|
use native_dialog::{FileDialog, MessageDialog};
|
||||||
|
use rand::distributions::{DistString};
|
||||||
use rust_embed::RustEmbed;
|
use rust_embed::RustEmbed;
|
||||||
use simplelog::{ColorChoice, ConfigBuilder, LevelFilter, TermLogger, TerminalMode};
|
use simplelog::{ColorChoice, ConfigBuilder, LevelFilter, TermLogger, TerminalMode};
|
||||||
use std::{borrow::Cow, path::PathBuf, thread::JoinHandle};
|
use std::{borrow::Cow, path::PathBuf, thread::JoinHandle};
|
||||||
|
@ -77,7 +78,9 @@ fn main() -> Result<()> {
|
||||||
}
|
}
|
||||||
|
|
||||||
info!("Run server");
|
info!("Run server");
|
||||||
run_server(img_path.to_path_buf());
|
let port = portpicker::pick_unused_port().ok_or_else(|| anyhow!("Cannot find ununsed port"))?;
|
||||||
|
let user_agent = rand::distributions::Alphanumeric.sample_string(&mut rand::thread_rng(), 32);
|
||||||
|
run_server(img_path.to_path_buf(), port, user_agent.clone());
|
||||||
|
|
||||||
info!("Create webview");
|
info!("Create webview");
|
||||||
let event_loop = EventLoop::new();
|
let event_loop = EventLoop::new();
|
||||||
|
@ -87,7 +90,8 @@ fn main() -> Result<()> {
|
||||||
.build(&event_loop)?;
|
.build(&event_loop)?;
|
||||||
let data_dir = directories::ProjectDirs::from("fr", "dalan", "SimplePanoramaViwer").unwrap();
|
let data_dir = directories::ProjectDirs::from("fr", "dalan", "SimplePanoramaViwer").unwrap();
|
||||||
let _webview = WebViewBuilder::new(window)?
|
let _webview = WebViewBuilder::new(window)?
|
||||||
.with_url("http://127.0.0.1:62371/index.html")?
|
.with_url(&format!("http://127.0.0.1:{}/index.html", port))?
|
||||||
|
.with_user_agent(&user_agent)
|
||||||
.with_web_context(&mut WebContext::new(Some(
|
.with_web_context(&mut WebContext::new(Some(
|
||||||
data_dir.cache_dir().to_path_buf(),
|
data_dir.cache_dir().to_path_buf(),
|
||||||
)))
|
)))
|
||||||
|
@ -111,8 +115,8 @@ fn main() -> Result<()> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
fn run_server(img_path: PathBuf) -> JoinHandle<()> {
|
fn run_server(img_path: PathBuf, port: u16, user_agent: String) -> JoinHandle<()> {
|
||||||
std::thread::spawn(|| {
|
std::thread::spawn(move || {
|
||||||
info!("Create runtime");
|
info!("Create runtime");
|
||||||
let async_runtime = tokio::runtime::Builder::new_current_thread()
|
let async_runtime = tokio::runtime::Builder::new_current_thread()
|
||||||
.enable_all()
|
.enable_all()
|
||||||
|
@ -134,10 +138,18 @@ fn run_server(img_path: PathBuf) -> JoinHandle<()> {
|
||||||
let datas = get_file_data(&format!("js/{}", val));
|
let datas = get_file_data(&format!("js/{}", val));
|
||||||
warp::http::Response::builder().body(datas)
|
warp::http::Response::builder().body(datas)
|
||||||
});
|
});
|
||||||
let img = warp::path!("img").map(move || std::fs::read(&img_path).unwrap());
|
let img = warp::path!("img")
|
||||||
|
.and(warp::header("user-agent"))
|
||||||
|
.map(move |agent: String| {
|
||||||
|
if agent == user_agent {
|
||||||
|
std::fs::read(&img_path).unwrap()
|
||||||
|
} else {
|
||||||
|
Vec::new()
|
||||||
|
}
|
||||||
|
});
|
||||||
info!("Launch webserver");
|
info!("Launch webserver");
|
||||||
async_runtime
|
async_runtime
|
||||||
.block_on(warp::serve(img.or(index).or(css).or(js)).run(([127, 0, 0, 1], 62371)));
|
.block_on(warp::serve(img.or(index).or(css).or(js)).run(([127, 0, 0, 1], port)));
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue