7 Commits

Author SHA1 Message Date
e8a21ac95f Release 1.2.1 2023-12-09 23:26:12 +01:00
d706e7c614 Update to axum 0.7 2023-12-09 23:21:19 +01:00
0bffa0fd96 Update smaller dependencies 2023-12-09 12:01:00 +01:00
fb0ce1dc0b Update trust_dns to 23.2 2023-12-09 11:54:07 +01:00
a67631fa9b cargo update 2023-12-09 11:17:33 +01:00
636e10f786 Adapted to the new syncronous interface of the HumusEngine 2023-10-30 17:44:33 +01:00
0076db531a cargo update 2023-10-30 17:41:37 +01:00
7 changed files with 465 additions and 487 deletions

867
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -1,30 +1,31 @@
[package] [package]
name = "echoip-slatecave" name = "echoip-slatecave"
version = "1.2.0" version = "1.2.1"
edition = "2021" edition = "2021"
authors = ["Slatian <baschdel@disroot.org>"] authors = ["Slatian <baschdel@disroot.org>"]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
lib-humus = { version="0.1", features=["axum-view+cookie"], git="https://codeberg.org/slatian/lib-humus.git" } lib-humus = { version="0.2", features=["axum-view+cookie"], git="https://codeberg.org/slatian/lib-humus.git" }
axum = { version = "0.6", features = ["macros", "headers"] } axum = { version = "0.7", features = ["macros"] }
axum-extra = { version = "0.7", features = ["cookie"] } axum-extra = { version = "0.9", features = ["cookie", "typed-header"] }
axum-client-ip = "0.4" axum-client-ip = "0.5"
clap = { version = "4", features = ["derive"] } clap = { version = "4", features = ["derive"] }
governor = "0.5" governor = "0.6"
idna = "0.3" idna = "0.4"
lazy_static = "1.4.0" lazy_static = "1.4.0"
parking_lot = "0.12" parking_lot = "0.12"
regex = "1.7" regex = "1.10"
serde = { version = "1", features = ["derive","rc"] } serde = { version = "1", features = ["derive","rc"] }
tokio = { version = "1", features = ["macros","signal"] } tokio = { version = "1", features = ["macros","signal"] }
tera = "1" tera = "1"
toml = "0.7" toml = "0.8"
tower = "0.4" tower = "0.4"
tower-http = { version = "0.4", features = ["fs"] } tower-http = { version = "0.5", features = ["fs"] }
trust-dns-proto = "0.22" trust-dns-proto = "0.23"
trust-dns-resolver = { version = "0.22", features = ["dns-over-rustls","dns-over-https","dns-over-quic"] } trust-dns-resolver = { version = "0.23", features = ["dns-over-rustls","dns-over-https","dns-over-quic"] }
maxminddb = "0.23" maxminddb = "0.23"
mime = "0.3" mime = "0.3"
http = "1.0"

View File

@ -43,8 +43,8 @@ pub struct DnsResolverConfig {
pub tls_dns_name: Option<Arc<str>>, pub tls_dns_name: Option<Arc<str>>,
#[serde(skip_serializing)] //Don't leak our bind address to the outside #[serde(skip_serializing)] //Don't leak our bind address to the outside
pub bind_address: Option<SocketAddr>, pub bind_address: Option<SocketAddr>,
#[serde(default="default_true")] #[serde(default="default_true", alias="trust_nx_responses")]
pub trust_nx_responses: bool, pub trust_negative_responses: bool,
} }
fn zero() -> i32 { fn zero() -> i32 {
@ -93,7 +93,7 @@ impl DnsResolverConfig {
socket_addr: *server, socket_addr: *server,
protocol: self.protocol.clone().into(), protocol: self.protocol.clone().into(),
tls_dns_name: self.tls_dns_name.clone().map(|s| s.to_string()), tls_dns_name: self.tls_dns_name.clone().map(|s| s.to_string()),
trust_nx_responses: self.trust_nx_responses, trust_negative_responses: self.trust_negative_responses,
tls_config: None, tls_config: None,
bind_addr: self.bind_address, bind_addr: self.bind_address,
}); });

View File

@ -1,20 +1,21 @@
use axum::{ use axum::{
body::Body,
extract::{ extract::{
self, self,
Query, Query,
State, State,
Extension, Extension,
}, },
headers,
http::Request,
handler::Handler, handler::Handler,
http::Request,
middleware::{self, Next}, middleware::{self, Next},
response::Response, response::Response,
Router, Router,
routing::get, routing::get,
TypedHeader,
}; };
use axum_client_ip::SecureClientIp; use axum_client_ip::SecureClientIp;
use axum_extra::headers;
use axum_extra::TypedHeader;
use clap::Parser; use clap::Parser;
use lazy_static::lazy_static; use lazy_static::lazy_static;
use regex::Regex; use regex::Regex;
@ -228,7 +229,7 @@ async fn main() {
let resolver = TokioAsyncResolver::tokio( let resolver = TokioAsyncResolver::tokio(
resolver_config.to_trust_resolver_config(), resolver_config.to_trust_resolver_config(),
Default::default() Default::default()
).unwrap(); );
dns_resolver_map.insert(key.clone(), resolver); dns_resolver_map.insert(key.clone(), resolver);
dns_resolver_selectables.push(Selectable { dns_resolver_selectables.push(Selectable {
id: key.clone(), id: key.clone(),
@ -311,21 +312,21 @@ async fn main() {
println!("Starting Server on {} ...",listen_on); println!("Starting Server on {} ...",listen_on);
axum::Server::bind(&listen_on) let listener = tokio::net::TcpListener::bind(&listen_on).await.unwrap();
.serve(app.into_make_service_with_connect_info::<std::net::SocketAddr>()) axum::serve(listener, app.into_make_service_with_connect_info::<std::net::SocketAddr>())
.await .await
.unwrap(); .unwrap();
} }
async fn settings_query_middleware<B>( async fn settings_query_middleware(
Query(query): Query<SettingsQuery>, Query(query): Query<SettingsQuery>,
Extension(config): Extension<config::EchoIpServiceConfig>, Extension(config): Extension<config::EchoIpServiceConfig>,
Extension(derived_config): Extension<DerivedConfiguration>, Extension(derived_config): Extension<DerivedConfiguration>,
cookie_header: Option<TypedHeader<headers::Cookie>>, cookie_header: Option<TypedHeader<headers::Cookie>>,
user_agent_header: Option<TypedHeader<headers::UserAgent>>, user_agent_header: Option<TypedHeader<headers::UserAgent>>,
mut req: Request<B>, mut req: Request<Body>,
next: Next<B> next: Next
) -> Response { ) -> Response {
let mut format = query.format; let mut format = query.format;
let mut dns_resolver_id = derived_config.default_resolver; let mut dns_resolver_id = derived_config.default_resolver;
@ -369,7 +370,7 @@ async fn not_found_handler(
state.templating_engine.render_view( state.templating_engine.render_view(
&settings, &settings,
View::NotFound, View::NotFound,
).await )
} }
async fn hello_world_handler( async fn hello_world_handler(
@ -382,9 +383,9 @@ async fn hello_world_handler(
&settings, &settings,
View::Message{ View::Message{
title: "Hey There!".to_string(), title: "Hey There!".to_string(),
message: "You,You are an awesome Creature!".to_string() message: "You are an awesome Creature!".to_string()
}, },
).await )
} }
@ -428,7 +429,7 @@ async fn handle_default_route(
result: result, result: result,
user_agent: user_agent, user_agent: user_agent,
} }
).await )
} }
@ -455,7 +456,7 @@ async fn handle_search_request(
return state.templating_engine.render_view( return state.templating_engine.render_view(
&settings, &settings,
View::Asn{asn: asn}, View::Asn{asn: asn},
).await )
} }
} }
@ -494,7 +495,7 @@ async fn handle_dns_resolver_route(
state.templating_engine.render_view( state.templating_engine.render_view(
&settings, &settings,
View::DnsResolverList, View::DnsResolverList,
).await )
} }
@ -508,12 +509,12 @@ async fn handle_dns_resolver_route_with_path(
state.templating_engine.render_view( state.templating_engine.render_view(
&settings, &settings,
View::DnsResolver{ config: resolver.clone() }, View::DnsResolver{ config: resolver.clone() },
).await )
} else { } else {
state.templating_engine.render_view( state.templating_engine.render_view(
&settings, &settings,
View::NotFound, View::NotFound,
).await )
} }
} }
@ -545,7 +546,7 @@ async fn handle_ip_request(
state.templating_engine.render_view( state.templating_engine.render_view(
&settings, &settings,
View::Ip{result: result} View::Ip{result: result}
).await )
} }
async fn get_ip_result( async fn get_ip_result(
@ -634,7 +635,7 @@ async fn handle_dig_request(
state.templating_engine.render_view( state.templating_engine.render_view(
&settings, &settings,
View::Dig{ query: dig_query, result: dig_result} View::Dig{ query: dig_query, result: dig_result}
).await )
} }

View File

@ -1,5 +1,6 @@
use axum_client_ip::SecureClientIp; use axum_client_ip::SecureClientIp;
use axum::{ use axum::{
body::Body,
extract::Extension, extract::Extension,
http::{ http::{
Request, Request,
@ -40,11 +41,11 @@ pub fn build_rate_limiting_state(
Extension(arc_limiter) Extension(arc_limiter)
} }
pub async fn rate_limit_middleware<B>( pub async fn rate_limit_middleware(
SecureClientIp(address): SecureClientIp, SecureClientIp(address): SecureClientIp,
Extension(arc_limiter): Extension<Arc<SimpleRateLimiter<IpAddr>>>, Extension(arc_limiter): Extension<Arc<SimpleRateLimiter<IpAddr>>>,
req: Request<B>, req: Request<Body>,
next: Next<B> next: Next
) -> Response { ) -> Response {
let limiter = Arc::clone(&arc_limiter); let limiter = Arc::clone(&arc_limiter);

View File

@ -121,9 +121,9 @@ pub fn set_default_if_none<T>(opt_vec: &mut Option<Vec<T>>) {
pub fn add_record_to_lookup_result(result: &mut DnsLookupResult, record: &RData){ pub fn add_record_to_lookup_result(result: &mut DnsLookupResult, record: &RData){
match record { match record {
RData::AAAA(address) => opush(&mut result.aaaa, std::net::IpAddr::V6(*address)), RData::AAAA(address) => opush(&mut result.aaaa, std::net::IpAddr::V6(address.0)),
RData::ANAME(aname) => opush(&mut result.aname, aname.to_string()), RData::ANAME(aname) => opush(&mut result.aname, aname.to_string()),
RData::A(address) => opush(&mut result.a, std::net::IpAddr::V4(*address)), RData::A(address) => opush(&mut result.a, std::net::IpAddr::V4(address.0)),
RData::CAA(caa) => opush(&mut result.caa, caa.to_string()), RData::CAA(caa) => opush(&mut result.caa, caa.to_string()),
RData::CNAME(cname) => opush(&mut result.cname, cname.to_string()), RData::CNAME(cname) => opush(&mut result.cname, cname.to_string()),
RData::MX(mx) => opush(&mut result.mx, MxRecord{ RData::MX(mx) => opush(&mut result.mx, MxRecord{

View File

@ -51,10 +51,10 @@ impl HumusView<QuerySettings, ResponseFormat> for View {
fn get_cookie_header(&self, settings: &QuerySettings) -> Option<String> { fn get_cookie_header(&self, settings: &QuerySettings) -> Option<String> {
Some( Some(
Cookie::build("dns_resolver",settings.dns_resolver_id.to_string()) Cookie::build(Cookie::new("dns_resolver",settings.dns_resolver_id.to_string()))
.path("/") .path("/")
.same_site(cookie::SameSite::Strict) .same_site(cookie::SameSite::Strict)
.finish() .build()
.to_string() .to_string()
) )
} }