Can restrict updates by ip
This commit is contained in:
parent
5832c02ff6
commit
2f50690fef
52
src/main.rs
52
src/main.rs
@ -38,6 +38,10 @@ struct Args {
|
|||||||
/// Handle for not found files. By default, a basic message is returned
|
/// Handle for not found files. By default, a basic message is returned
|
||||||
#[clap(short, long, env, default_value = "")]
|
#[clap(short, long, env, default_value = "")]
|
||||||
not_found_file: String,
|
not_found_file: String,
|
||||||
|
|
||||||
|
/// Optional proxy IP
|
||||||
|
#[clap(short, long, env)]
|
||||||
|
proxy_ip: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Args {
|
impl Args {
|
||||||
@ -60,9 +64,57 @@ struct NewFile {
|
|||||||
bytes: Vec<u8>,
|
bytes: Vec<u8>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Check if two ips matches
|
||||||
|
pub fn match_ip(pattern: &str, ip: &str) -> bool {
|
||||||
|
if pattern.eq(ip) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if pattern.ends_with('*') && ip.starts_with(&pattern.replace('*', "")) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
false
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/// Get the remote IP address
|
||||||
|
fn get_remote_ip(req: &HttpRequest, args: &Args) -> String {
|
||||||
|
let mut ip = req.peer_addr().unwrap().ip().to_string();
|
||||||
|
|
||||||
|
// We check if the request comes from a trusted reverse proxy
|
||||||
|
if let Some(proxy) = args.proxy_ip.as_ref() {
|
||||||
|
if match_ip(proxy, &ip) {
|
||||||
|
if let Some(header) = req.headers().get("X-Forwarded-For") {
|
||||||
|
let header: Vec<String> = header
|
||||||
|
.to_str()
|
||||||
|
.unwrap()
|
||||||
|
.to_string()
|
||||||
|
.split(",")
|
||||||
|
.map(|f| f.to_string())
|
||||||
|
.collect();
|
||||||
|
|
||||||
|
if header.len() > 0 {
|
||||||
|
ip = header[0].to_string();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
ip
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Replace all the files of the website
|
/// Replace all the files of the website
|
||||||
async fn replace_files(args: web::Data<Args>, req: HttpRequest, mut payload: Multipart) -> Result<HttpResponse, Error> {
|
async fn replace_files(args: web::Data<Args>, req: HttpRequest, mut payload: Multipart) -> Result<HttpResponse, Error> {
|
||||||
|
|
||||||
|
// Validate remote IP
|
||||||
|
let remote_ip = get_remote_ip(&req, &args);
|
||||||
|
if !match_ip(&args.allowed_ips_for_update, &remote_ip) {
|
||||||
|
log::warn!("Block unauthorized attempt to perform site update from {}", remote_ip);
|
||||||
|
return Err(ErrorUnauthorized("You are not allowed to perform updates!"));
|
||||||
|
}
|
||||||
|
|
||||||
// Check token
|
// Check token
|
||||||
let token = match req.headers().get("Token") {
|
let token = match req.headers().get("Token") {
|
||||||
None => {
|
None => {
|
||||||
|
Loading…
Reference in New Issue
Block a user