Simplify and fixup implementations for paths
This commit is contained in:
@ -9,7 +9,7 @@ use rocket::{
|
|||||||
fairing::AdHoc,
|
fairing::AdHoc,
|
||||||
futures::SinkExt,
|
futures::SinkExt,
|
||||||
http::Status,
|
http::Status,
|
||||||
request::{FromRequest, Outcome, Request},
|
request::{FromParam, FromRequest, Outcome, Request},
|
||||||
trace::error,
|
trace::error,
|
||||||
Rocket, State,
|
Rocket, State,
|
||||||
};
|
};
|
||||||
@ -111,6 +111,22 @@ impl IsStatic for Scanners {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl FromParam<'_> for Scanners {
|
||||||
|
type Error = String;
|
||||||
|
|
||||||
|
fn from_param(param: &'_ str) -> Result<Self, Self::Error> {
|
||||||
|
match param {
|
||||||
|
"stretchoid" => Ok(Scanners::Stretchoid),
|
||||||
|
"binaryedge" => Ok(Scanners::Binaryedge),
|
||||||
|
"stretchoid.txt" => Ok(Scanners::Stretchoid),
|
||||||
|
"binaryedge.txt" => Ok(Scanners::Binaryedge),
|
||||||
|
"censys.txt" => Ok(Scanners::Censys),
|
||||||
|
"internet-measurement.com.txt" => Ok(Scanners::InternetMeasurement),
|
||||||
|
v => Err(format!("Unknown value: {v}")),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
impl<'de> Deserialize<'de> for Scanners {
|
impl<'de> Deserialize<'de> for Scanners {
|
||||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
where
|
where
|
||||||
@ -364,47 +380,39 @@ struct SecurePath {
|
|||||||
pub data: String,
|
pub data: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl TryInto<SecurePath> for &str {
|
impl FromParam<'_> for SecurePath {
|
||||||
type Error = String;
|
type Error = String;
|
||||||
|
|
||||||
fn try_into(self) -> Result<SecurePath, Self::Error> {
|
fn from_param(param: &'_ str) -> Result<Self, Self::Error> {
|
||||||
// A-Z a-z 0-9
|
// A-Z a-z 0-9
|
||||||
// . - _
|
// . - _
|
||||||
if self
|
if param
|
||||||
.chars()
|
.chars()
|
||||||
.all(|c| c.is_ascii_alphanumeric() || c == '.' || c == '-' || c == '_')
|
.all(|c| c.is_ascii_alphanumeric() || c == '.' || c == '-' || c == '_')
|
||||||
{
|
{
|
||||||
return Ok(SecurePath {
|
return Ok(SecurePath {
|
||||||
data: self.to_string(),
|
data: param.to_string(),
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
Err(format!("Invalid value: {}", self.to_string()))
|
Err(format!(
|
||||||
|
"Invalid path value (forbidden chars): {}",
|
||||||
|
param.to_string()
|
||||||
|
))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[get("/collections/<vendor_name>/<file_name>")]
|
#[get("/collections/<vendor_name>/<file_name>")]
|
||||||
async fn handle_get_collection(
|
async fn handle_get_collection(
|
||||||
vendor_name: &str,
|
vendor_name: SecurePath,
|
||||||
file_name: &str,
|
file_name: SecurePath,
|
||||||
app_configs: &State<AppConfigs>,
|
app_configs: &State<AppConfigs>,
|
||||||
) -> MultiReply {
|
) -> MultiReply {
|
||||||
let vendor_name: Result<SecurePath, String> = vendor_name.try_into();
|
|
||||||
let vendor_name = match vendor_name {
|
|
||||||
Ok(secure_path) => secure_path.data,
|
|
||||||
Err(err) => return MultiReply::FormError(PlainText(err.to_string())),
|
|
||||||
};
|
|
||||||
let file_name: Result<SecurePath, String> = file_name.try_into();
|
|
||||||
let file_name = match file_name {
|
|
||||||
Ok(secure_path) => secure_path.data,
|
|
||||||
Err(err) => return MultiReply::FormError(PlainText(err.to_string())),
|
|
||||||
};
|
|
||||||
|
|
||||||
let mut path: PathBuf = PathBuf::new();
|
let mut path: PathBuf = PathBuf::new();
|
||||||
let static_data_dir: String = app_configs.static_data_dir.clone();
|
let static_data_dir: String = app_configs.static_data_dir.clone();
|
||||||
path.push(static_data_dir);
|
path.push(static_data_dir);
|
||||||
path.push("collections");
|
path.push("collections");
|
||||||
path.push(vendor_name);
|
path.push(vendor_name.data);
|
||||||
path.push(file_name);
|
path.push(file_name.data);
|
||||||
match NamedFile::open(path).await {
|
match NamedFile::open(path).await {
|
||||||
Ok(file) => MultiReply::FileContents(file),
|
Ok(file) => MultiReply::FileContents(file),
|
||||||
Err(err) => MultiReply::NotFound(err.to_string()),
|
Err(err) => MultiReply::NotFound(err.to_string()),
|
||||||
@ -414,15 +422,10 @@ async fn handle_get_collection(
|
|||||||
#[get("/scanners/<scanner_name>")]
|
#[get("/scanners/<scanner_name>")]
|
||||||
async fn handle_list_scanners(
|
async fn handle_list_scanners(
|
||||||
mut db: DbConn,
|
mut db: DbConn,
|
||||||
scanner_name: &str,
|
scanner_name: Scanners,
|
||||||
app_configs: &State<AppConfigs>,
|
app_configs: &State<AppConfigs>,
|
||||||
) -> MultiReply {
|
) -> MultiReply {
|
||||||
let static_data_dir: String = app_configs.static_data_dir.clone();
|
let static_data_dir: String = app_configs.static_data_dir.clone();
|
||||||
let scanner_name: Result<Scanners, String> = scanner_name.try_into();
|
|
||||||
let scanner_name = match scanner_name {
|
|
||||||
Ok(scanner_name) => scanner_name,
|
|
||||||
Err(err) => return MultiReply::FormError(PlainText(err.to_string())),
|
|
||||||
};
|
|
||||||
if scanner_name.is_static() {
|
if scanner_name.is_static() {
|
||||||
let mut path: PathBuf = PathBuf::new();
|
let mut path: PathBuf = PathBuf::new();
|
||||||
path.push(static_data_dir);
|
path.push(static_data_dir);
|
||||||
|
Reference in New Issue
Block a user