diff --git a/src/geoip.rs b/src/geoip.rs index fd9df49..475c604 100644 --- a/src/geoip.rs +++ b/src/geoip.rs @@ -50,11 +50,11 @@ pub struct MMDBCarrier { } pub trait QueryLocation { - fn query_location_for_ip(&self, address: IpAddr, laguages: &Vec<&String>) -> Option; + fn query_location_for_ip(&self, address: &IpAddr, laguages: &Vec<&String>) -> Option; } pub trait QueryAsn { - fn query_asn_for_ip(&self, address: IpAddr) -> Option; + fn query_asn_for_ip(&self, address: &IpAddr) -> Option; } /* Converters */ @@ -119,10 +119,10 @@ pub fn geoip2_subdivision_to_named_location(item: geoip2::model::Subdivision, la /* Implementation */ impl QueryAsn for MMDBCarrier { - fn query_asn_for_ip(&self, address: IpAddr) -> Option { + fn query_asn_for_ip(&self, address: &IpAddr) -> Option { match &self.mmdb { Some(mmdb) => { - match mmdb.lookup::(address) { + match mmdb.lookup::(*address) { Ok(res) => { Some(AsnResult { asn: res.autonomous_system_number, @@ -141,10 +141,10 @@ impl QueryAsn for MMDBCarrier { } impl QueryLocation for MMDBCarrier { - fn query_location_for_ip(&self, address: IpAddr, languages: &Vec<&String>) -> Option { + fn query_location_for_ip(&self, address: &IpAddr, languages: &Vec<&String>) -> Option { match &self.mmdb { Some(mmdb) => { - match mmdb.lookup::(address) { + match mmdb.lookup::(*address) { Ok(res) => { Some(LocationResult { continent: diff --git a/src/main.rs b/src/main.rs index 5de8f2a..4060757 100644 --- a/src/main.rs +++ b/src/main.rs @@ -48,19 +48,14 @@ use crate::templating_engine::{ use crate::ipinfo::{AddressCast,AddressInfo,AddressScope}; #[derive(serde::Deserialize, serde::Serialize, Clone)] -pub struct BaseQuery { +pub struct SettingsQuery { format: Option, lang: Option, } #[derive(serde::Deserialize, serde::Serialize, Clone)] -pub struct IpQuery { - ip: IpAddr, -} - -#[derive(serde::Deserialize, serde::Serialize, Clone)] -pub struct DigQuery { - name: String, +pub struct SearchQuery { + query: Option, } #[derive(serde::Deserialize, serde::Serialize, Clone)] @@ -221,9 +216,7 @@ async fn main() { // Initalize axum server let app = Router::new() .route("/", get(handle_default_route)) - .route("/dig", get(handle_dig_route)) .route("/dig/:name", get(handle_dig_route_with_path)) - .route("/ip", get(handle_ip_route)) .route("/ip/:address", get(handle_ip_route_with_path)) .route("/ua", get(user_agent_handler)) .route("/hi", get(hello_world_handler)) @@ -245,7 +238,7 @@ async fn main() { } async fn format_and_language_middleware( - Query(query): Query, + Query(query): Query, Extension(config): Extension, user_agent_header: Option>, mut req: Request, @@ -294,19 +287,16 @@ async fn user_agent_handler( } async fn handle_default_route( + Query(search_query): Query, State(arc_state): State>, Extension(settings): Extension, user_agent_header: Option>, SecureClientIp(address): SecureClientIp ) -> Response { - - let ip_query = IpQuery { - ip: address, - }; let state = Arc::clone(&arc_state); - let result = get_ip_result(&ip_query, &settings.lang, &state).await; + let result = get_ip_result(&address, &settings.lang, &state).await; let user_agent: Option = match user_agent_header { Some(TypedHeader(user_agent)) => Some(user_agent.to_string()), @@ -316,52 +306,60 @@ async fn handle_default_route( state.templating_engine.render_view( &settings, &View::Index{ - query: ip_query, + query: address, result: result, user_agent: user_agent, } ).await } -async fn handle_ip_route( - Query(ip_query): Query, - Extension(settings): Extension, - State(arc_state): State>, -) -> Response { - return handle_ip_request(ip_query, settings, arc_state).await -} - -async fn handle_ip_route_with_path( - Extension(settings): Extension, - State(arc_state): State>, - extract::Path(address): extract::Path, -) -> Response { - return handle_ip_request(IpQuery { - ip: address, - }, settings, arc_state).await -} - -async fn handle_ip_request( - ip_query: IpQuery, +async fn handle_search_request( + search_query: String, + this_should_have_been_an_ip: bool, settings: TemplateSettings, arc_state: Arc, ) -> Response { let state = Arc::clone(&arc_state); - let result = get_ip_result(&ip_query, &settings.lang, &state).await; + + state.templating_engine.render_view( + &settings, + &View::Message{title: "Your Search query was:".to_string(), message: search_query} + ).await +} + +async fn handle_ip_route_with_path( + Extension(settings): Extension, + State(arc_state): State>, + extract::Path(query): extract::Path, +) -> Response { + if let Ok(address) = query.parse() { + return handle_ip_request(address, settings, arc_state).await + } else { + return handle_search_request(query, true, settings, arc_state).await; + } +} + +async fn handle_ip_request( + address: IpAddr, + settings: TemplateSettings, + arc_state: Arc, +) -> Response { + + let state = Arc::clone(&arc_state); + let result = get_ip_result(&address, &settings.lang, &state).await; state.templating_engine.render_view( &settings, - &View::Ip{query: ip_query, result: result} + &View::Ip{query: address, result: result} ).await } async fn get_ip_result( - ip_query: &IpQuery, + address: &IpAddr, lang: &String, state: &ServiceSharedState, ) -> IpResult { - let address = ip_query.ip; let ip_info = AddressInfo::new(&address); @@ -412,26 +410,16 @@ async fn get_ip_result( } } -async fn handle_dig_route( - Query(dig_query): Query, - Extension(settings): Extension, - State(arc_state): State>, -) -> Response { - return handle_dig_request(dig_query, settings, arc_state).await -} - async fn handle_dig_route_with_path( Extension(settings): Extension, State(arc_state): State>, extract::Path(name): extract::Path, ) -> Response { - return handle_dig_request(DigQuery { - name: name, - }, settings, arc_state).await + return handle_dig_request(name, settings, arc_state).await } async fn handle_dig_request( - dig_query: DigQuery, + dig_query: String, settings: TemplateSettings, arc_state: Arc, ) -> Response { @@ -448,10 +436,10 @@ async fn handle_dig_request( } async fn get_dig_result( - dig_query: &DigQuery, + dig_query: &String, state: &ServiceSharedState, ) -> simple_dns::DnsLookupResult { - let name = &dig_query.name.trim().trim_end_matches(".").to_string(); + let name = &dig_query.trim().trim_end_matches(".").to_string(); if match_domain_hidden_list(&name, &state.config.dns.hidden_suffixes) { Default::default() } else { diff --git a/src/templating_engine.rs b/src/templating_engine.rs index 123722a..ec6a15b 100644 --- a/src/templating_engine.rs +++ b/src/templating_engine.rs @@ -13,10 +13,10 @@ use axum::{ use tera::Tera; use toml::Table; +use std::net::IpAddr; + use crate::simple_dns; use crate::IpResult; -use crate::IpQuery; -use crate::DigQuery; /* Response format */ @@ -53,9 +53,9 @@ pub struct TemplateSettings { #[derive(serde::Deserialize, serde::Serialize, Clone)] #[serde(untagged)] pub enum View { - Dig { query: DigQuery, result: simple_dns::DnsLookupResult }, - Index { query: IpQuery, result: IpResult, user_agent: Option }, - Ip { query: IpQuery, result: IpResult }, + Dig { query: String, result: simple_dns::DnsLookupResult }, + Index { query: IpAddr, result: IpResult, user_agent: Option }, + Ip { query: IpAddr, result: IpResult }, Message{ title: String, message: String }, #[serde(rename="404")] NotFound,